取消设置多维数组中的列
Posted
技术标签:
【中文标题】取消设置多维数组中的列【英文标题】:Unset a column in a multidimensional array 【发布时间】:2011-11-07 19:06:35 【问题描述】:我有这个数组 $output,它看起来像这样:
Array(
[0] => Array(
[0] => 1a
[1] => 1b
[2] => 1c
)
[1] => Array(
[0] => 2a
[1] => 2b
[2] => 2c
)
[2] => Array(
[0] => 3a
[1] => 3b
[2] => 3c
)
[3] => Array(
[0] => 4a
[1] => 4b
[2] => 4c
)
)
等等……
当我想删除我刚刚使用的第二个元素时:
$output = unset($output[1]);
获得以下信息:
Array(
[0] => Array(
[0] => 1a
[1] => 1b
[2] => 1c
)
[1] => Array(
[0] => 3a
[1] => 3b
[2] => 3c
)
[2] => Array(
[0] => 4a
[1] => 4b
[2] => 4c
)
)
我的问题是如何删除数组中每个元素的第二个元素 ([0][1], [1][1], [2][1], [3][1] ,... ) 得到以下内容:
Array(
[0] => Array(
[0] => 1a
[1] => 1c
)
[1] => Array(
[0] => 2a
[1] => 2c
)
[2] => Array(
[0] => 3a
[1] => 3c
)
[3] => Array(
[0] => 4a
[1] => 4c
)
)
【问题讨论】:
unset() 不返回任何内容。 【参考方案1】:我用这个:
public function array_unset_key_in_children($array, $keyToUnsetInChildren)
$newArray = [];
foreach($array as $key=>$subArray)
unset($subArray[$keyToUnsetInChild]);
$newArray[$key] = $subArray;
return $newArray;
【讨论】:
@mickmackusa 谢谢,我在未设置之前删除了“array_key_exists”,但是关于突变 - 我有一个案例(无法解释原因,但它是百分之百的案例)突变原始数组最终使用了多次更多内存(导致“内存耗尽,试图分配......”)同时创建新数组确实变得无比容易。已经调试了一天的案例,这对我来说肯定结束了。 好的。您可能想在答案中解释您的 sn-p 的好处。【参考方案2】:干净整洁:
$f = function(&$a,$k) unset($a[1]); ;
array_walk($arr, $f);
或者:
array_walk($arr, function (&$a, $k)
unset($a[1]);
);
【讨论】:
为什么要声明$k
?你从不使用它。【参考方案3】:
foreach($array as $key=>$val) unset($val[1]);
【讨论】:
这个纯代码答案不会影响原始$array
,而是$array
副本中的一个元素。在$val
中,1
-keyed 元素将被删除,但$array
永远不会发生变异。证明:3v4l.org/aZ52f【参考方案4】:
您将使用array_map
和array_splice
的组合:
function removeSecond( array &$arr )
array_splice( $arr, 1, 1 );
$out = array_map( 'removeSecond', $input );
unset
的问题在于它会使索引保持原样:
$ php -r '$arr = array(array(0,1,2)); unset($arr[0][1]); var_dump($arr);'
array(1)
[0]=>
array(2)
[0]=>
int(0)
[2]=>
int(2)
虽然 splice 会更新索引:
$ php -r '$arr = array(array(0,1,2)); array_splice($arr[0], 1, 1); var_dump($arr);'
array(1)
[0]=>
array(2)
[0]=>
int(0)
[1]=>
int(2)
【讨论】:
【参考方案5】:不能用简单的命令完成,但可以使用循环:
foreach(array_keys($output) as $key)
unset($output[$key][1]);
【讨论】:
非常有帮助,谢谢!为了增加您的答案,如果您想在未设置后保持剩余键的顺序,您可以在foreach
的末尾(和内部)包括:$output[$key] = array_values($output[$key]);
。 array_values()
将重新设置键的基数,使它们从零开始顺序排列。
如果你想在取消设置后重新索引,只需调用array_splice()
@cwallen 演示。【参考方案6】:
您可以遍历数组,unset()
每个子数组中您想要的内容:
foreach($output as &$item)
unset($item[2]);
unset($item); // unset reference
【讨论】:
确保你像上面的arnaud一样包含&
,当你调用unset时需要引用它以上是关于取消设置多维数组中的列的主要内容,如果未能解决你的问题,请参考以下文章