举个例子:
$data = array();
$data['a']['one'] = 'test';
这将发出通知,因为$data [‘a’]不存在.所以相反,我总是这样做:
$data = array();
$data['a'] = array();
$data['a']['one'] = 'test';
或者,如果我在循环中,这样的事情:
$data = array();
foreach ($items as $item) {
if (!isset($data['a'])) {
$data['a'] = array();
}
$data['a']['one'] = $item->getId();
}
这在代码中变得非常敏感并且凌乱.我知道我可以写一些array_push替代函数来处理这个,但我想知道是否有办法用现有的PHP方法做到这一点.
解决方法:
首先在某处初始化整个阵列(所有键,子阵列等)是不切实际的.
这意味着记住并维护它 – 当您有以前没有考虑过的新数据时,您还必须将其添加到阵列初始化中.
(Urgh)
我至少将var作为一个数组($data = array();),然后你不需要is_array() – 这是一个令人讨厌的单行代码,甚至你做任何有用的事情(两行包括右括号). ).
但是,不需要您的检查.
您的代码检查是否已设置数组的子数组,如果没有,则将其设置为数组,然后将数据设置到其上.
这不是必需的,因为即使先前未设置某些子键/数组,您也可以在数组中设置数据.
例如,此代码(这是整个文件和所有运行的代码)不会抛出错误,警告或通知:
$data['a']['one']['blah']['foo'] = 'test';
print_r($data);
echo $data['a']['one']['blah']['foo'];
以上输出:
数组([a] =>数组([one] =>数组([blah] =>数组([foo] => test))))
测试
上述代码不会返回任何警告/通知/错误.
另请注意,我甚至没有$data = array().
(虽然你想,因为你可能使用foreach并且初始化否定了使用is_array的需要).
这是与error_reporting(-1);
TL; DR; – 答案
因此,要回答您的问题,您可以在代码中执行此操作(并且不会收到任何错误/通知/警告):
$data = array();
// more data setting the array up
foreach ($items as $item) {
$data['a']['one'] = $item->getId();
}
标签:php,arrays,multidimensional-array
来源: https://codeday.me/bug/20190708/1401593.html