按值删除二维数组的行元素并重新索引

问题描述 投票:0回答:3

我有这个数组:

$array = [
    ['b', 'd', 'c', 'a', ''],
    ['c', 'a', 'd', '', ''],
    ['b', 'd', 'a', '', ''],
    ['c', 'd', 'a', 'b', '']
];

并且需要删除(取消设置?)所有值为“c”的元素,以便最终得到:

$array = [
    ['b', 'd', 'a', ''],
    ['a', 'd', '', ''],
    ['b', 'd', 'a', '', ''],
    ['d', 'a', 'b', '']
];

该元素被删除,其他元素向上移动。我知道 unset 不会重新索引数组。无法对所有多维数组进行取消设置,但只能对一个数组进行取消设置。之后可以重新索引数组吗?

下面的代码删除了值等于“c”的元素,但第一个元素的索引没有重新索引。谁能建议一个重新索引内部数组的解决方案?

$i = 0;
foreach ($array as $val)
{
    foreach ($val as $key => $final_val)
    {
        if ($final_val == "$search_value") 
        {
             unset($array[$i][$key]);
        }
    } 
    $i = $i + 1;
}
php arrays multidimensional-array filtering reindex
3个回答
5
投票

以下代码将执行您想要的操作:

<?php
$a = 1;
$b = 2;
$c = 3;
$d = 4;

$arr = array(
array ( $b, $d, $c, $a, $b),
array ($c, $a),
array ( $b, $d,  $c ),
array( $c, $d, $a, $b, $b)
);
echo "before:\n";
print_r($arr);

foreach($arr as $k1=>$q) {
  foreach($q as $k2=>$r) {
    if($r == $c) {
      unset($arr[$k1][$k2]);
    }
  }
}
echo "after:\n";
print_r($arr);
?>

输出:

before:
Array
(
    [0] => Array
        (
            [0] => 2
            [1] => 4
            [2] => 3
            [3] => 1
            [4] => 2
        )

    [1] => Array
        (
            [0] => 3
            [1] => 1
        )

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

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

)
after:
Array
(
    [0] => Array
        (
            [0] => 2
            [1] => 4
            [3] => 1
            [4] => 2
        )

    [1] => Array
        (
            [1] => 1
        )

    [2] => Array
        (
            [0] => 2
            [1] => 4
        )

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

)

如你所见,所有的

3
都消失了......


0
投票

搜索子数组中的值,然后取消设置。

$search = 'c';
$result = array_map(function ($value) use ($search) {
   if(($key = array_search($search, $value)) !== false) {
      unset($value[$key]);
   }
   return $value;
}, $your_array);

或者你也可以使用循环:

// this way change your original array
foreach ($your_array as &$sub_array) {
    if(($key = array_search($search, $sub_array)) !== false) {
        unset($sub_array[$key]);
    }
}
var_dump($your_array);

0
投票

对于时尚的功能方法,请使用

array_map()
访问行,然后使用
array_filter()
array_diff()
删除所有值为
c
的元素。
array_filter()
的性能可能比
array_diff()
稍好,但
array_diff()
更简洁,并且可以非常轻松地进行调整以删除多个黑名单值。

如果查找的值在给定行中出现多次,则

array_search()
将不合适——它只会返回第一个匹配的键。

在返回变异行之前,使用

array_values()
重新索引它。

代码(演示)

var_export(
    array_map(
        fn($row) => array_values(array_diff($row, ['c'])),
        $array
    )
);
© www.soinside.com 2019 - 2024. All rights reserved.