PHP - поиск в многомерном массиве и возвращение ссылки на результат - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь написать функцию, которая ищет в многомерном массиве массив с определенным идентификатором, а затем возвращает ссылку на этот найденный массив.Я придумал это, но он работает не так, как я ожидал.

$list = array(
    "id"=>"123",
    "items"=>array(
        "id"=>"456"
    )
);

function &getArrayById(&$array, $id) {

    //Found
    if(isset($array["id"]) && $array["id"] == $id) {
        return $array;
    }

    //Not found, looking for nested array
    foreach(array_keys($array) as $key) {

        if (gettype($array[$key]) === "array") {

            $o = getArrayById($array[$key], $id);

            if(gettype($o) != "NULL") {
                return $o;
            }

        }

    }

    //Not found - end
    return null;
}


$a =& getArrayById($list, "456");
$a["id"] = "ID EDITED";
echo $list["items"]["id"]; //"456" - not "ID EDITED" like I want

Одна вещь, которую я заметил, это то, что при поиске с использованием идентификатора 123 (т. Е. Самого верхнего уровня массива),Попытка отредактировать идентификатор возвращаемого массива с помощью $ a работает, как и ожидалось, поэтому мне интересно, не рекурсивная ли она работает не так, как я ожидаю.

1 Ответ

0 голосов
/ 02 февраля 2019

Действительно, рекурсивному вызову также требуется «назначение по ссылке» (=&):

$o =& getArrayById($array[$key], $id);

Это одна из тех вещей в PHP ... Наличие префикса & вОпределение функции само по себе недостаточно, как указано в документации :

Примечание: В отличие от передачи параметров, здесь вы должны использовать & в обоихместа - чтобы указать, что вы хотите вернуть по ссылке, а не по копии, и указать, что привязка ссылки, а не обычное присвоение, должна быть сделана

...