php-比较数组并按相同顺序压缩

假设我们有以下数组:

$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(),并且当前数组元素是否等于下一个元素.

可以简单地做到这一点,方法是使用ord()获取字符的ASCII值并在比较之前添加一个.

如果它们相等,则递增$i和$followUp.

循环之后,您可以检查是否有多个字符跟在当前字符的后面(例如:A,D = 0跟进,A,B,D = 1跟进; A,B,C = 2跟进).并且如果您有多个值,则在此值之间打印一个破折号.

然后,如果不是数组的末尾,则还要打印逗号来分隔值.

在for循环的末尾,只需检查是否只有1个跟进,然后通过分配0来反转$i的增量即可重置$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-显示来自多个自定义帖子类型的特定类别的帖子