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

20
我有一个多维的PHP数组,表示如下表格:
```html

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

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


2
对于你发布的问题,被接受的答案的第一个评论真的说了一切。 - George
那个答案只有4行,再简单不过了。它只使用了你自己提供的函数和一个foreach循环... - dtech
1
好的,让我重新表达一下:有更高效的方法吗? - Horen
3
这不是一个重复问题。这个问题是关于“删除”一列,另一个问题则是如何返回x列。这两个问题是不同的。 - John Ballinger
5个回答

24

试试这个:

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 的函数是不合适的(它是基于偏移量而不是键的)。


很酷。可惜我无法通过谷歌找到查找和删除空列的方法。有现成的解决方案吗? - Hebe

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

3
您可以在每一行上对列应用unset()函数:
foreach ($array as &$row) {
    unset($row['column']);
}

$array 不再包含该列。


0

对于多维数组使用array_values重新索引不是100%确定。否则,这应该是一个简单的解决方案。

$array = array() // your array above    
foreach ( range(0, count($array)-1) as $i ) {
        unset($array[$i][1]);
        // optional - re-index the array
        $array[$i] = array_values($array[$i]);
    }

0

根据我在这里看到的,一个更完整的函数来递归地删除(或不删除)数组中的一个或多个列:

function array_columns_delete(&$array, $keys,$recursive=false) {
    return array_walk($array, function (&$v) use ($keys,$recursive) {
        foreach((array)$keys as $key) {
            if (isset($v[$key])) unset($v[$key]);
            if ($recursive==true){
                foreach($v as $k=>&$s){
                    if (is_array($s)) array_columns_delete($s, $keys,$recursive);
                }                
            }
        }
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接