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

3
我有一个数组,想要从中删除相关值。
例如:
在数组[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
        )
)

我不知道如何做到这一点。这可能吗?

1
数字总是有序的吗?例如 1/2/6/51/2/5/6/7 - Eddie
是的,@Eddie,然后数字总是按顺序排列。 - R P
像1/2/3,1/2/3/4一样。 - R P
@Eddie 这是可能的吗? - R P
嗨,@dan08,那些都是ID值。[0]有1/2/3,[1]有1/2/3/4,所以1/2/3已经在1/2/3/4中使用了,因此不需要在数组中。我想你现在明白我的意思了。 - R P
2个回答

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);

谢谢,@Karol Samborski。 - R P

1
假设数组已经排序,您可以使用array_reverse函数来反转数组。使用array_reduce函数遍历数组,使用strpos函数检查字符串中子字符串的第一次出现位置。请保留HTML标签。
$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
        )

)

1
是的,@Eddie谢谢,使用正确的代码它可以正常工作。 - R P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接