ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-19 22:39:04  阅读:281  来源: 互联网

标签:loops for-loop foreach arrays 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

标签:loops,for-loop,foreach,arrays,php
来源: https://codeday.me/bug/20191119/2039589.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有