18

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

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

4

4 回答 4

23

尝试这个:

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

于 2013-05-15T13:06:11.743 回答
4

状态的 PHP 手册array_walk()(已添加重点):

只有数组的可能会改变;它的结构不能改变,即程序员不能添加、取消设置或重新排序元素。如果回调不遵守此要求,则此函数的行为是undefined不可预测的。

这对我来说听起来好像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;
}
于 2019-03-20T10:35:10.493 回答
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);
                }                
            }
        }
    });
}
于 2020-10-31T12:32:05.857 回答
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]);
    }
于 2022-01-13T20:07:11.770 回答