【问题标题】:PHP - Check for duplicate in an array and update the duplicate value in loopPHP - 检查数组中的重复项并更新循环中的重复值
【发布时间】:2016-02-21 07:14:48
【问题描述】:
$mymarker = '/MARKER[0-9]{2}/';
preg_match_all($mymarker, $mycontent, $matches);
var_dump($matches);

给予:

array(1) {
  [0]=>
  array(18) {
    [0]=>
    string(8) "MARKER00"
    [1]=>
    string(8) "MARKER01"
    [2]=>
    string(8) "MARKER02"
    [3]=>
    string(8) "MARKER04"
    [4]=>
    string(8) "MARKER05"
    [5]=>
    string(8) "MARKER07"
    [6]=>
    string(8) "MARKER09"
    [7]=>
    string(8) "MARKER13"
    [8]=>
    string(8) "MARKER13"
    [9]=>
    string(8) "MARKER16"
    [10]=>
    string(8) "MARKER15"
    [11]=>
    string(8) "MARKER21"
    [12]=>
    string(8) "MARKER31"
    [13]=>
    string(8) "MARKER22"
    [14]=>
    string(8) "MARKER24"
    [15]=>
    string(8) "MARKER26"
    [16]=>
    string(8) "MARKER80"
    [17]=>
    string(8) "MARKER81"
  }
}

正如我们所见,MARKER13 出现了两次。 MARKER05、MARKER07 和 MARKER13 可能会出现这种重复实例。

第二个值需要更新为 MARKERXX+1 所以 第二次出现:

Marker05 必须更新为 MARKER06 Marker07 必须更新为 MARKER08 MARKER13 必须更新为 MARKER14。

我们如何在循环中设置它,以检查重复并将重复值更新为下一个值。

谢谢

【问题讨论】:

    标签: php arrays regex


    【解决方案1】:

    可能有更简单的方法,但你可以想出以下方法

    <?php
    $matches = array("MARKER00","MARKER01","MARKER02","MARKER04","MARKER05","MARKER07","MARKER09","MARKER13","MARKER13","MARKER16","MARKER15","MARKER21","MARKER31","MARKER22","MARKER24","MARKER26","MARKER80","MARKER81");
    
    $duplicates = array("MARKER05", "MARKER07", "MARKER13");
    $len = count($matches);
    
    for ($i=0;$i<$len;$i++) {
        $marker = $matches[$i];
    
        if (in_array($marker, $duplicates)) {
            // one of our markers
            // check if the next is the same
            // if so update it
            if ($i<$len-1) {
                if ($marker == $matches[$i+1]) {
                    # split the string into a letter and a digit part
                    # with lookarounds (behind/ahead, both positive)
                    list($text,$number) = preg_split('~(?<=[A-Z])(?=\d)~', $matches[$i+1]);
                    $number = intval($number);
                    # increase the intval'd number by one
                    # and apply it to the original array
                    $number += 1;
                    $matches[$i+1] = $text . $number;
                }
            }
        }
    }
    
    print_r($matches);
    // updated to MARKER14
    
    ?>
    

    显然,这只有在数组是有序的情况下才有效,即重复跟随。

    【讨论】:

    • 谢谢。你的回复给了我一个避免循环部分的想法。 MARKERXX 是我在 MARKERXX 和下一个 MARKERXX 上按顺序拆分的 html 文档中的位置(XX 可以是任何数字,不一定是有序的)以映射到 db 列。 MARKERXX 是通过 preg_replace 获得的。因此,由于只有固定 (3) 个标记可以在整个文件集中重复,所以我运行 preg_replace($patterns, $replacements, 1) 两次,分别使用 05、07、13 和下一次使用 06、08 和 14 和在数组中得到不重复的 MARKERSXX。 :)
    猜你喜欢
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2013-07-10
    • 2011-06-24
    • 1970-01-01
    相关资源
    最近更新 更多