我有一个多维的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);
I found this approach但是想知道是否有更简单的方法(类似于行)删除列?也许首先调换阵列?
答案 0 :(得分:16)
试试这个:
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 的函数在这种情况下是不合适的(它是基于偏移的而不是基于密钥的)。
答案 1 :(得分:0)
The PHP manual for array_walk()
状态(强调):
仅可能更改数组的值;其结构不能更改,即程序员不能添加,取消设置或重新排序元素。如果回调不符合此要求,则此函数的行为为未定义和不可预测。
在我看来,mpyw's and Amade's answer可能有效,但无法依靠。
以下是更安全的解决方案:
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;
}
答案 2 :(得分: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);
}
}
}
});
}