PHP 向多维数组添加新索引,恕不另行通知

Tyl*_* V. 5 php arrays multidimensional-array

举个例子:

$data = array();
$data['a']['one'] = 'test';
Run Code Online (Sandbox Code Playgroud)

这将引发通知,因为$data['a']不存在。因此,我总是这样做:

$data = array();
$data['a'] = array();
$data['a']['one'] = 'test';
Run Code Online (Sandbox Code Playgroud)

或者如果我陷入循环,像这样:

$data = array();
foreach ($items as $item) {
    if (!isset($data['a'])) {
        $data['a'] = array();
    }
    $data['a']['one'] = $item->getId();
}
Run Code Online (Sandbox Code Playgroud)

这在代码中变得非常重复并且混乱。我知道我可以编写某种array_push替代函数来处理这个问题,但我想知道是否有一种方法可以使用现有的 PHP 方法来做到这一点。

Jam*_*mes 2

首先在某处初始化整个数组(所有键、子数组等)是不切实际的。

这意味着记住并维护它 - 当您有以前未考虑到的新数据时,您还必须将其添加到数组初始化中。
(呃)

我至少会将 var 作为数组 ( $data = array();) 删除,那么你就不需要is_array()- 在你做任何有用的事情之前,这是一行烦人的代码(包括右大括号的两行......)。

但是,不需要您的检查。
您的代码检查数组的子数组是否已设置,如果没有,则将其设置为数组,然后将数据设置到其上。

这是不必要的,因为即使之前未设置某些子键/数组,您也可以在数组中设置数据。

例如,此代码(这是整个文件和所有运行的代码不会抛出错误、警告或通知:

$data['a']['one']['blah']['foo'] = 'test';

print_r($data);

echo $data['a']['one']['blah']['foo'];
Run Code Online (Sandbox Code Playgroud)

以上输出:

Array ([a] => Array ( [one] => Array ( [blah] => Array ( [foo] => test ) ) ) )

test

上面的代码不会返回任何警告/通知/错误。
另请注意,我什至没有$data = array()
(尽管您想要这样做,因为您可能使用 foreach 并且初始化不需要使用 is_array )。

那是与error_reporting(-1);

TL;博士; - 答案

因此,要回答你的问题,在你的代码中你可以这样做(并且不会收到错误/通知/警告):

$data = array();

// more data setting the array up  

foreach ($items as $item) {
    $data['a']['one'] = $item->getId();
}
Run Code Online (Sandbox Code Playgroud)