我有这个数组:
$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
$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
都消失了......
搜索子数组中的值,然后取消设置。
$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);
对于时尚的功能方法,请使用
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
)
);