Mengapa tidak ada cukup memori dalam loop paling sederhana dan dengan array 3 elemen?

Ada fungsi yang menampilkan kategori mulai dari paling atas:

function getFullCategoryName($strCategoryId, $arrCategories)
{
    $strCategoryIdPaent = NULL;
    $arrCategoryCurr = isset($arrCategories[$strCategoryId]) ? $arrCategories[$strCategoryId] : NULL;
    $arrCategoriesNames = [];
    while (is_array($arrCategoryCurr)) {
        $arrCategoriesNames[] = $arrCategoryCurr['title'];
        if ($arrCategoryCurr['parentId'] && isset($arrCategories[$arrCategoryCurr['parentId']])) {
            $arrCategoryCurr = $arrCategories[$arrCategoryCurr['parentId']];
        } else {
            $arrCategoryCurr = NULL;
        }
    }
    krsort($arrCategoriesNames);
    return implode(' > ', $arrCategoriesNames);
}

Dengan hanya 3 elemen array, saya mendapatkan kesalahan:

"Ukuran memori yang diizinkan sebesar 134217728 byte habis"

Saya mengerti bahwa saya menggunakan sesuatu yang salah. Tolong, bantu saya memahami apa sebenarnya.

Ini adalah array masukan saya:

$arrCategories = array (
    193450 => 
    array (
        'id' => '193450',
        'parentId' => '193450',
        'title' => 'Blood glucose meter',
    ),
    193451 => 
    array (
        'id' => '193451',
        'parentId' => '193450',
        'title' => 'Sugar test strips',
    ),
    193452 => 
    array (
        'id' => '193452',
        'parentId' => '193452',
        'title' => 'Blood glucose meter',
    ),
);

Ini adalah panggilan ke fungsi tersebut:

$strCategoryId = 193450;
getFullCategoryName($strCategoryId, $arrCategories);

person oshka    schedule 20.05.2019    source sumber
comment
else { $arrCategoryCurr = NULL; } bagian ini tidak terpicu   -  person Shobi    schedule 20.05.2019
comment
Mungkin. Tetapi ketika saya telah mengubah NULL menjadi string NULL phpfiddle.org/main/code/9h6v-wu42 errornya sama E_ERROR : ketik 1 -- Ukuran memori yang diizinkan sebesar 134217728 byte habis (mencoba mengalokasikan 134217736 byte) -- pada baris 29   -  person oshka    schedule 20.05.2019
comment
Mengubah NULL menjadi string bukanlah masalah. Kondisi else tidak pernah dimasukkan, jadi $arrCategoryCurr tidak pernah disetel ke NULL (atau 'NULL' atau apa pun), jadi is_array($arrCategoryCurr) tetap benar tanpa batas waktu, sehingga perulangan tidak pernah berakhir.   -  person deceze♦    schedule 20.05.2019


Jawaban (2)


Data (sampel) Anda memiliki masalah berdasarkan pembacaan saya terhadap fungsi Anda.

parentId dan index sama di beberapa item. Ini akan menciptakan lingkaran tak terbatas berdasarkan apa yang bisa saya kerjakan dari pertanyaan itu.

Struktur yang lebih baik adalah seperti berikut, dengan beberapa pemeriksaan kesalahan di loop:

function getFullCategoryName($strCategoryId, $arrCategories) {
    // set a base / default value
    $arrCategoriesNames = [];
    // do we even have anything to work with?
    if (isset($arrCategories[$strCategoryId])) {
        // at least one entry
        do {
            // get the title
            $arrCategoriesNames[] = $arrCategories[$strCategoryId]['title'];

            // get the next id and error check the data
            if ((isset($arrCategories[$strCategoryId]['parentId'])) && 
                ($strCategoryId != $arrCategories[$strCategoryId]['parentId'])) {
                // next index found and not the same
                $strCategoryId = $arrCategories[$strCategoryId]['parentId'];

            } else {
                // either no parentId or a parentId that matches the current 
                // index. If that is the case, go no further.
                $strCategoryId = false;
            }
            // you could add another error check if you like.
            // if (count($arrCategoriesNames) == count($arrCategories)) {
            //     // go no further as data has a loop
            //     $strCategoryId = false;
            // }
        } while($strCategoryId);

        // sort the data? why?
        krsort($arrCategoriesNames);
    }
    // return a string
    return implode(' > ', $arrCategoriesNames);
}

Dan menguji array sampel Anda;

$result = getFullCategoryName(193450,$arrCategories);
var_dump($result);

Mengembalikan yang berikut ini:

string(19) "Blood glucose meter"
person Tigger    schedule 20.05.2019

Perulangan while (is_array($arrCategoryCurr)) tidak pernah berakhir karena blok else dari $arrCategoryCurr = NULL; tidak pernah dipanggil.

Hal ini terjadi karena Anda memiliki perulangan di mana id simpul sama dengan id induknya. Lihatlah susunan Anda:

....
'id' => '193450',
'parentId' => '193450',
...

Untuk memperbaikinya, ubah pernyataan if menjadi:

if ($arrCategoryCurr['parentId'] && $arrCategoryCurr['parentId'] != $arrCategoryCurr['id'] && isset($arrCategories[$arrCategoryCurr['parentId']])) {
person dWinder    schedule 20.05.2019
comment
Terima kasih @dWinder! Saya telah mengubah kode saya dengan cara yang sama seperti yang Anda tulis! - person oshka; 20.05.2019