gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:37:19 25 4
gpt4 key购买 nike

假设我们有这些数组:

$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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com