【问题标题】:How to remove array from array if value have related to other value in array in PHP?如果值与PHP中数组中的其他值相关,如何从数组中删除数组?
【发布时间】:2018-07-06 13:15:08
【问题描述】:

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

例如。

在数组 [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/2/6/51/2/5/6/7
  • 是的,@Eddie 然后编号总是按顺序排列。
  • 喜欢 1/2/3、1/2/3/4
  • @Eddie 有可能吗?
  • HI @dan08,这都是 ids 值。 [0] 有 1/2/3,[1] 有 1/2/3/4,所以 1/2/3 已经在 1/2/3/4 中使用,所以不需要在数组中。我想你现在可以明白我在说什么了。

标签: php arrays regex


【解决方案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
        )

)

【讨论】:

  • 是的@Eddie 谢谢它使用正确的代码正常工作。
【解决方案2】:

当然可以。你需要先对元素进行排序,然后就很简单了。

<?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。
猜你喜欢
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 2021-10-14
  • 2010-11-20
  • 2019-09-05
  • 2019-09-11
  • 2011-03-04
  • 2017-12-16
相关资源
最近更新 更多