取消设置多维数组中的列

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_maparray_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时需要引用它

以上是关于取消设置多维数组中的列的主要内容,如果未能解决你的问题,请参考以下文章

如何取消设置多维数组中的最后一项?

通过嵌套的 foreaches 取消设置多维数组中的键

如何删除多维数组中的唯一元素?

如何通过表行而不是php中的列来回显多维数组值[关闭]

将多维数组的列格式化为一维数组

PHP:使用 foreach 从多维数组中删除元素(按键)