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
Вижте отговора, който трябва да се отървете от другия ако тест. В противен случай нищо никога няма да бъде върнато. - person Pitchinnate; 20.05.2013
comment
Съжалявам, не разбирам какво имаш предвид? Има два теста if, първият проверява дали местоположението има parentID, ако има, тогава се изпълнява отново, а вторият е, когато е корен/най-високо ниво/няма родители, където след това връща масива . Ако отпечатам в този момент, мога да видя, че масивът е както се очаква. Ако променя print_r за връщане, получавам NULL. - person Joeme; 20.05.2013
comment
Да, но вие връщате масива към друг екземпляр на изпълняваната функция, а не към първия екземпляр на изпълняваната функция. Следователно първата ви инстанция никога няма да върне нищо. Само последното ниво. - person Pitchinnate; 20.05.2013