PHP - уведомление «Неопределенный индекс» не вызывается при обращении (&) к неинстанцированному элементу ассоциативного массива - PullRequest
0 голосов
/ 29 июня 2018

Я искал этот код из этого ответа :

$string = 'item1:item2:itemx';

$res = array();

$temp = &$nested_array;
foreach(explode(':', $string) as $key) {
    $temp = &$temp[$key];
}

, что, благодаря только до $temp = &$temp[$key], приводит к:

$res = [
  "item1" => [
    "item2" => [
      "itemx" => & null
    ]]]

Я не понимаю, почему &temp[$key] создает ассоциацию [$key => null], а $temp[$key] - нет.

Я сделал некоторую отладку и для первого $key ( item1 ):

  1. $ a = $ temp [$ key]:
    • выдает уведомление "неопределенный индекс" .
    • dumping $a возвращает ноль.
    • dumping $temp возвращает ноль.
  2. $ a = & $ temp [$ key]:
    • не выдает уведомление «неопределенный индекс» .
    • dumping $a возвращает ноль.
    • dumping $temp[$key] возвращает ноль.
    • сброс $temp возвращает: ["item1" => & null]

Это означает, что $temp = & $temp[$key] создает также $ temp [$ key] или, что эквивалентно, ему предшествует:

$temp = &temp[$key]; <=> $temp[$key] = null; $temp = &temp[$key];

Я хотел бы понять, объясняется ли это где-нибудь в документации php (я искал, но ничего не нашел) или я что-то упустил obviuos.

Спасибо

1 Ответ

0 голосов
/ 29 июня 2018

Это объясняется в документации. Неопределенные переменные создаются при создании ссылки:

Примечание
Если вы назначите, передадите или вернете неопределенную переменную по ссылке, она будет создана.

Пример # 1 Использование ссылок с неопределенными переменными

<?php
function foo(&$var) { }

foo($a); // $a is "created" and assigned to null

$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)

$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>

https://secure.php.net/manual/en/language.references.whatdo.php

...