如果值与PHP中数组中的其他值相关,如何从数组中删除数组?

时间:2018-07-06 13:15:09

标签: php arrays regex

我有一个数组,想从数组中删除相关的值。

例如

  

在数组[0]中具有1/2/3,[1]具有1/2/3/4,则[0]与[1]相关,因此   从数组中删除具有1/2/3的[0]。

另一个例子是

例如

  

[2]具有1/2/5,[3]具有1/2/5/6,[4]具有1/2/5/6/7,然后[2]和   [3]取决于[4],因此请从数组中删除[2]和[3]这两个数组。

有关更多详细信息,请检查以下示例。

Array
(
    [0] => Array
        (
            [id] => 1/2/3
        )

    [1] => Array
        (
            [id] => 1/2/3/4
        )

    [2] => Array
        (
            [id] => 1/2/5
        )

    [3] => Array
        (
            [id] => 1/2/5/6
        )

    [4] => Array
        (
            [id] => 1/2/5/6/7
        )
)

想要的输出:

Array
(

    [0] => Array
         (
            [id] => 1/2/3/4
        )


    [1] => Array
        (
            [id] => 1/2/5/6/7
        )
)

我不知道该怎么办。有可能吗?

2 个答案:

答案 0 :(得分:1)

当然可以。您需要先对元素进行排序,然后非常简单。

<?php

$input = [
  [ "id" => "1/2/3" ],
  [ "id" => "1/2/3/4" ],
  [ "id" => "1/2/5" ],
  [ "id" => "1/2/5/6" ],
  [ "id" => "1/2/5/6/7" ]
];

//firstly sort this array in reverse order
//like so 1/2/3/4 is before 1/2/3
usort(
  $input,
  function($e1, $e2) {
    return $e2["id"] <=> $e1["id"];
  }
);

$output = array_reduce(
  $input,
  function($out, $el) {
    if (empty($out)) {
      $out[] = $el;
    } else {
      $lastEl = $out[count($out) - 1];
      //we add element to the result array
      //only if actual last element doesn't begin with it 
      if (strpos($lastEl['id'], $el['id']) !== 0) {
        $out[] = $el;
      }
    }
    return $out;
  },
  []
);

var_dump($output);

答案 1 :(得分:1)

假设数组顺序正确,则可以array_reverse数组。使用array_reduce遍历数组,使用strpos检查字符串中第一次出现的子字符串的位置。

$arr = //your array
$result = array_reduce( array_reverse( $arr ), function( $c, $v ){
    if ( count( $c ) === 0 ) $c[] = $v;
    else if ( count( $c ) && strpos( $c[0]['id'] , $v['id'] ) === false ) array_unshift( $c, $v );      
    return $c;
}, array());

echo "<pre>";
print_r( $result );
echo "</pre>";

这将导致:

Array
(
    [0] => Array
        (
            [id] => 1/2/3/4
        )

    [1] => Array
        (
            [id] => 1/2/5/6/7
        )

)