PHP - 移除多维数组中的元素

5

我有一个数组:

Array ( 
[0] => Array ( [0] => b [1] => d [2] => **c** [3] =>a [4] => ) 

[1] => Array ( [0] => **c** [1] => a [2] => d [3] => [4] => ) 

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

[3] => Array ( [0] => **c** [1] => d [2] => a [3] =>b [4] => )

)

需要删除(unset?)所有值为“c”的元素,以便最终得到以下结果:

Array ( 
[0] => Array ( **[0] => b [1] => d [2] => a [3] => [4] =>** ) 

[1] => Array ( **[0] => a [1] => d [2] => [3] =>** ) 

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

[3] => Array ( **[0] => d [1] => a [2] =>b [3] =>** )

)

该元素被移除后,其他元素会向上移动。我知道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;
    }

你期望数组的维度在之后会是什么?一般来说它不会是一个矩形。如果你真的关心这些元素是二维的,并且有些元素是“一次性”的,那么你可能需要看看稀疏数组的概念(尽管即使在稀疏数组中,“消失”实际上只意味着“零”)。难道你不能将它们设置为NaN吗?你真正想要的是什么?... - Floris
Floris - 我不确定你的意思。我正在寻找一种简单的方法,可以删除任何具有特定值的元素。 - FartMachine4U
2个回答

6
以下代码可以实现你想要的功能:
<?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都消失了...


1
在子数组中搜索值,然后将其取消设置。
$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);

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