1. PHP / Говнокод #5893

    +158

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    function &_extract(&$array, $path) {
      $element = &$array;
      while(count($path)) {
        $key = array_shift($path);
        $element = &$element[$key];
      }
    
      return $element;
    }

    Запостил: vectoroc, 05 Марта 2011

    Комментарии (12) RSS

    • Пытался написать код, достающий вложенный элемент по ссылке.
      Но достается только значение. Может знает кто, как это реализовать?
      Ответить
      • Всё правильно, только присваивать нужно тоже по ссылке.
        $x = array(
        	'f'=>array(
        		'd'=>2
        	)
        );
        
        $b = &_extract($x, array('f', 'd'));
        $b = 3;
        print_r($x);
        Ответить
        • в новой версии амперсанды необязательны
          Ответить
          • новая - это какая?
            Ответить
            • 5.3.0
              Ответить
              • может я не так понял. мы об амперсандах перед именем функции, да?
                http://www.php.net/manual/en/language.references.return.php
                Ответить
                • As of PHP 5.3.0, you will get a warning saying that "call-time pass-by-reference" is deprecated
                  Ответить
                  • call-time pass-by-reference — это somefunc(&$myarg),
                    но никак не &somefunc($myarg)
                    Ответить
                    • на ретурны, стало быть, не распространяется?
                      Ответить
                      • это вообще совсем другое. так что, конечно.

                        возврат по ссылке работает только если:
                        1) сама функция помечена как возвращаемая ссылку
                        2) её возвращаемое значение является не выражением, а переменной
                        3) сам приём возвращаемого значения функции тоже написан как передача ссылки.

                        если какой-то пункт не выполняется, то функция работает как без амперсанда (при невыполнении только 2 notice выкидывается).
                        Ответить
      • не кормите нубов
        Ответить

    Добавить комментарий