php возвращаемый массив из функции возвращает NULL

Все еще только изучаю PHP, так что извините, если это глупо! У меня есть функция, которая перебирает таблицу смежности mysql. Я хотел бы вернуть это как массив. Кажется, это нормально, если, когда я возвращаюсь в функцию, я делаю print_r($path); где $path — это массив внутри функции, массив печатается так, как я хочу.

Проблема в том, что я не понимаю, почему я не могу получить к нему доступ через

$patharray = functioncalled($vars);

Я пытался использовать return $path; а также просто print_r в массиве, но он продолжает возвращать NULL.

function getParPath($mysqli, $showpar, $path) {
    // Get Parent Path
    $query ="select loc_id, loc_name, loc_parent from locations where loc_id = ? LIMIT 0,1";
    if ($stmt = mysqli_prepare($mysqli, $query)) {

        /* pass parameters to query */
        mysqli_stmt_bind_param($stmt, "s", $showpar);

        /* run the query on the database */
        mysqli_stmt_execute($stmt);

        /* store result */
        mysqli_stmt_store_result($stmt);

        /* assign variable for each column to store results in */
        mysqli_stmt_bind_result($stmt, $loc_id, $loc_name, $loc_parent);

        /* fetch values */
        while (mysqli_stmt_fetch($stmt)) {

            $path[] = $loc_name;

            if ($loc_parent !='0'){
                getParPath($mysqli, $loc_parent, $path);
            }
            if ($loc_parent =='0'){
                $path = array_reverse($path);
                return $path; // uncommented per answers below.
                //print_r($path); //commented out per answers below.
            }

        }
    }
}

$patharray = getParPath($mysqli, $showcld, $path);
//print_r(getParPath($mysqli, $showcld, $path)); // removed per answers below
var_dump($patharray); //removed echo per answers below
exit;

Что возвращает:

Array
(
    [0] => BuildingA
    [1] => FloorA
    [2] => RoomA
)
Array
(
    [0] => BuildingA
    [1] => FloorA
    [2] => RoomA
)
NULL

Итак, как вы можете видеть из последней строки, массив $patharray, который я установил для вызова функции, равен NULL. И что, если я попытаюсь print_r внутри функции, будет напечатан массив, а если я попытаюсь print_r выполнить функцию напрямую, она вернет массив. Но не в объект, который я могу использовать.


person Joeme    schedule 20.05.2013    source источник


Ответы (1)


Вы должны return $path;, а не только echo или print_r.

$path = array_reverse($path);
return $path;  //Uncomment this line
//print_r($path); //Comment out this line

Также вам нужно изменить это, вы не устанавливали $path равным результатам:

if ($loc_parent !='0'){
    $path = getParPath($mysqli, $loc_parent, $path);
}

Также избавьтесь от теста if, потому что он будет продолжать работать, пока не дойдет до конца, после чего вам нужно вернуться.

if ($loc_parent !='0'){
    $path = getParPath($mysqli, $loc_parent, $path);
}
$path = array_reverse($path);
return $path;
person Pitchinnate    schedule 20.05.2013
comment
Лол, у тебя даже это есть, просто закомментировано. - person Pitchinnate; 20.05.2013
comment
Спасибо, но... У меня это было изначально, и оно не работало, поэтому я закомментировал его и вместо этого вставил print_r, чтобы я мог видеть, что на самом деле выводит функция. Что-то еще не так? - person Joeme; 20.05.2013
comment
Если я прокомментирую print_r и раскомментирую строку возврата, это просто приведет к NULL - person Joeme; 20.05.2013
comment
Зачем тебе echo vardump() vardump() сам эхо тебе не нужен echo. Также закомментируйте print_r(getParPath($mysqli, $showcld, $path));, это избыточно и усложняет отладку. - person Pitchinnate; 20.05.2013
comment
Я не знал этого о vardump, спасибо, я удалил print_r сейчас, я обновил код в вопросе до того, как он соответствует вашим комментариям. Он просто возвращает NULL - person Joeme; 20.05.2013
comment
Я добавил $path = .. когда вы обновили ответ, но он все равно возвращает NULL. Если я помещу print_r($path) внутри функции над возвратом, я увижу, что она печатает массив. Я снова удалил print_r (просто тестировал) - person Joeme; 20.05.2013
comment
См. ответ, который вам нужен, чтобы избавиться от другого теста if. В противном случае ничего никогда не будет возвращено. - person Pitchinnate; 20.05.2013
comment
Извините, я не понимаю, что вы имеете в виду? Есть два теста if, первый проверяет, есть ли у местоположения parentID, если да, то он запускается снова, а второй — когда это корневой/верхний уровень/нет родителей, и тогда он возвращает массив . Если я напечатаю в этот момент, я увижу, что массив такой, как ожидалось. Если я изменю print_r на return, я получу NULL. - person Joeme; 20.05.2013
comment
Да, но вы возвращаете массив другому экземпляру выполняемой функции, а не первому экземпляру выполняемой функции. Поэтому ваш первый экземпляр никогда ничего не вернет. Только последний уровень. - person Pitchinnate; 20.05.2013