php - 比较数组并在相同顺序下压缩它

标签 php arrays loops for-loop foreach

假设我们有这些数组:

$a = array("B", "C", "D", "E");
$b = array("A", "B" , "C", "D", "E", "F", "G", "H", "I");

然后我想检查 $a 中的子序列在 $b 中是否连续。如果是,并且超过 3 个元素,我想用破折号输出它们,例如X-Y。在所有其他情况下,我只想打印出逗号分隔的值。

所以上述 $a 数组的预期输出将是:

B-E

另一个例子:

$a = array("B", "C", "D", "F", "H");
//Same $b array to check if a sub sequence of $a appears in $b consecutive

预期输出:

B-D, F, H

我在 foreach 循环中尝试了一些疯狂的 foreach,它检查两个数组中的值并设置指针,然后比较指针。这感觉太复杂了,现在我的头很痛。

我觉得我遗漏了一些明显的东西,这是非常简单的事情。

编辑:这是我目前的进度。

$pointer = count($b);
$a = array("B", "C" , "D", "E");
$b = array("A", "B", "C" , "D", "E", "F", "G");

foreach ($b as $key => $bb) {
    if ($a[0] == $bb) {
        $pointer = $key;
    }
}


$d = array();
$d[] = $a[0];
foreach ($a as $key => $aa) {
    if ($aa == $b[$pointer+$key]) {
        $pointer = $key;
    } else {
        $d[] = "-".$aa;
        $pointer++;
    }
}
echo implode('',$d);

编辑 2:值不仅仅是字母。它们是字符串,可以有不同的长度。 ("AA", "b", "lk") 例如。

最佳答案

这应该适合你:

只需遍历整个数组,并在每次迭代中只打印迭代的当前值。

然后在 while 循环中使用 isset() 检查数组中是否还有下一个元素AND 如果当前数组元素等于下一个元素。

这可以简单地通过使用 ord() 获取字符的 ASCII 值来完成。并在比较之前添加一个。

如果它们相等,则增加 $i$followUp

在循环之后,您可以检查当前字符后面是否有超过 1 个字符(例如:AD = 0 follow Up,A, B, D = 1 跟进;A, B, C = 2 跟进)。如果你有超过 1 个,你打印这个值,中间用破折号。

然后如果它不是数组的末尾也打印一个逗号来分隔值。

在 for 循环结束时,只需检查是否只有 1 个 follow Up 并反转 $i 的增量 + 通过分配 0 重置 $followUp

<?php

    $a = array("A", "B", "C", "F", "H", "K", "L", "M", "N", "R", "S", "X", "Y", "Z");

    $length = count($a);
    $followUp = 0;
    for($i = 0; $i < $length; $i++) {

        echo $a[$i];

        while(isset($a[$i+1]) && (ord($a[$i]) + 1) == ord($a[$i+1])){
            ++$followUp;
            ++$i;
        }

        if($followUp > 1)
            echo "-" . $a[$i];

        if($i != count($a) - 1)
            echo ",";

        if($followUp == 1) --$i;
        $followUp = 0;

    }

?>

输出:

A-C,F,H,K-N,R,S,X-Z

编辑:

如果你想检查子序列是否以相同的顺序在另一个数组中,你可以简单地改变一下 while 条件。

只是implode()搜索数组并检查 strpos()如果你可以用 array_slice() 得到子数组并且还内爆成一个字符串,在搜索数组中。

<?php

    $a = array("A", "B", "C", "F", "H", "K", "L", "M", "N", "R", "S", "X", "Y", "Z");
    $b = array("A", "B" , "C", "D", "E","F", "H", "M", "N", "R", "S", "F", "G", "H", "I", "M", "N", "R", "S");

    $length = count($a);
    $followUp = 0;
    for($i = 0; $i < $length; $i++) {

        echo $a[$i];
        $current = $i;
        while(isset($a[$i]) && strpos(implode("|", $b), implode("|", array_slice($a, $current, $followUp+1))) !== FALSE){
            ++$followUp;
            ++$i;
        }

        if($followUp > 2)
            echo "-" . $a[--$i];

        if($i != count($a) - 1)
            echo ",";

        if($followUp <= 2) $i = $current;
        $followUp = 0;

    }

?>

输出:

A-C,F,H,K,L,M-S,X,Y,Z

关于php - 比较数组并在相同顺序下压缩它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31967128/

相关文章:

php - 检查 mysql 行是否不在数组中

php - 将 PHP 数组写入文件生成二进制文件而不是纯文本

php - 当另一个 htaccess 位于子文件夹中时,URL 重写不起作用

循环内的 JavaScript 闭包 – 简单的实际示例

php - 更改 PHP 文件数组

python - 如何修改字节数组?

c - 我如何正确地找出结构数组的大小?

php - 我如何计算 PHP 中的逗号分隔值?

c - 在 C 中使用嵌套 for 循环打印星号模式

javascript - 如何一次执行一个循环语句(jQuery)?