假设我们有以下数组:
$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