从多维数组中删除“列”的最佳方法

2022-08-30 21:04:32

我有一个多维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)

现在我想删除第二行和第二列(顺便说一句,这只是一个简化的示例)。
删除行很容易:

array_splice($array, 1, 1);

我发现了这种方法,但想知道是否有更简单的方法(类似于行)来删除列?也许先转置数组?


答案 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

编辑(Amade):

delete_col函数也可以稍作修改,以处理缺少列的数组:

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

例如,当您需要循环访问数组并在每个步骤中删除一些列时,可以使用此功能。在这种情况下,使用array_splice而不是unset的函数是不合适的(它是基于偏移量的,而不是基于键的)。


答案 2

php 手册的 array_walk() 状态(着重号是后加的):

只有数组的值可能会被更改;它的结构不能改变,即程序员不能添加,取消设置或重新排序元素。如果回调不满足此要求,则此函数的行为是未定义的,并且是不可预测的

在我看来,这似乎好像mpyw和Amade的答案可能有效,但不能依赖。

更安全的解决方案可能是:

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;
}