从多维数组中删除“列”的最佳方法(Best way to delete “column” from

2019-09-03 08:28发布

我有一个多维PHP数组表示像这样的表

-------------
| A | 0 | A |
|---|---|---|
| 0 | 0 | 0 |
|---|---|---|
| A | 0 | A |
-------------

所以数组是这样的:

array (size=3)
  0 => 
    array (size=3)
      0 => string 'A' (length=1)
      1 => string '0' (length=1)
      2 => string 'A' (length=1)
  1 => 
    array (size=3)
      0 => string '0' (length=1)
      1 => string '0' (length=1)
      2 => string '0' (length=1)
  2 => 
    array (size=3)
      0 => string 'A' (length=1)
      1 => string '0' (length=1)
      2 => string 'A' (length=1)

现在我想删除第二行和第二列(这只是BTW一个简单的例子)。
删除该行很简单:

array_splice($array, 1, 1);

我发现这种方法 ,但不知道是否有删除列,以及更简单的方式(类似于行)? 也许调换阵列的第一?

Answer 1:

试试这个:

function delete_row(&$array, $offset) {
    return array_splice($array, $offset, 1);
}

function delete_col(&$array, $offset) {
    return array_walk($array, function (&$v) use ($offset) {
        array_splice($v, $offset, 1);
    });
}

测试在Ideone: http://ideone.com/G5zRi0

编辑(阿马德):

delete_col功能也可以稍加修改与缺少的列阵列的工作:

function delete_col(&$array, $key) {
    return array_walk($array, function (&$v) use ($key) {
        unset($v[$key]);
    });
}

这可以当你需要遍历数组,并删除在每个步骤中的一些列用于例如。 A,使用函数array_splice而不是取消设置不会在这样的情况下适当的(它的偏移量为基础的,而不是基于密钥)。



Answer 2:

对于PHP手册array_walk()状态(强调):

阵列的唯一可以潜在地被改变; 其结构不能被改变 ,即,程序员不能添加,取消设置或重新排序的元素。 如果回调不尊重这个要求,这个函数的行为是不确定的 ,且不可预测

这听起来我好像mpyw的和阿马德的回答可能会奏效,但不能依赖。

一个更安全的解决方案可能是以下几点:

function delete_col(&$array, $key)
{
    // Check that the column ($key) to be deleted exists in all rows before attempting delete
    foreach ($array as &$row)   { if (!array_key_exists($key, $row)) { return false; } }
    foreach ($array as &$row)   { unset($row[$key]); }

    unset($row);

    return true;
}


文章来源: Best way to delete “column” from multidimensional array