Hor*_*ren 12 php arrays array-splice
我有一个多维的PHP数组,代表一个像这样的表
-------------
| A | 0 | A |
|---|---|---|
| 0 | 0 | 0 |
|---|---|---|
| A | 0 | A |
-------------
Run Code Online (Sandbox Code Playgroud)
所以数组看起来像这样:
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)
Run Code Online (Sandbox Code Playgroud)
现在我想删除第二行和第二列(这只是一个简化的例子btw).
删除行很容易:
array_splice($array, 1, 1);
Run Code Online (Sandbox Code Playgroud)
我找到了这种方法但是想知道是否有更简单的方法(类似于行)删除列?也许首先调换阵列?
mpy*_*pyw 17
试试这个:
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);
});
}
Run Code Online (Sandbox Code Playgroud)
在Ideone上测试:http://ideone.com/G5zRi0
编辑(Amade):
也可以稍微修改delete_col函数以使用缺少列的数组:
function delete_col(&$array, $key) {
return array_walk($array, function (&$v) use ($key) {
unset($v[$key]);
});
}
Run Code Online (Sandbox Code Playgroud)
这可以用于例如当您需要迭代数组并在每个步骤中删除一些列时.使用array_splice而不是unset的函数在这种情况下是不合适的(它是基于偏移的而不是基于密钥的).
小智 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;
}
Run Code Online (Sandbox Code Playgroud)