我有一个数组,想从数组中删除相关的值。
例如
在数组[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
)
)
我不知道该怎么办。有可能吗?
答案 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
)
)