เหตุใดหน่วยความจำไม่เพียงพอในการวนซ้ำที่ง่ายที่สุดและมีอาร์เรย์ 3 องค์ประกอบ

มีฟังก์ชั่นแสดงหมวดหมู่ตั้งแต่ด้านบนสุด:

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);
}

ด้วยองค์ประกอบอาร์เรย์เพียง 3 องค์ประกอบ ฉันได้รับข้อผิดพลาด:

"ขนาดหน่วยความจำที่อนุญาตคือ 134217728 ไบต์หมด"

ฉันเข้าใจว่าฉันใช้สิ่งผิดปกติ โปรดช่วยฉันเข้าใจว่าอะไรกันแน่

นี่คืออาร์เรย์อินพุตของฉัน:

$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',
    ),
);

นี่คือการเรียกใช้ฟังก์ชัน:

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

person oshka    schedule 20.05.2019    source แหล่งที่มา
comment
else { $arrCategoryCurr = NULL; } ส่วนนี้ไม่ได้รับการทริกเกอร์   -  person Shobi    schedule 20.05.2019
comment
อาจจะ. แต่เมื่อฉันเปลี่ยน NULL เป็น string NULL phpfiddle.org/main/code/9h6v-wu42 ข้อผิดพลาดเหมือนกัน E_ERROR: ประเภท 1 -- ขนาดหน่วยความจำที่อนุญาต 134217728 ไบต์หมด (พยายามจัดสรร 134217736 ไบต์) - ที่บรรทัด 29   -  person oshka    schedule 20.05.2019
comment
การเปลี่ยน NULL เป็นสตริงไม่ใช่ปัญหา ไม่เคยป้อนเงื่อนไข else ดังนั้น $arrCategoryCurr จึงไม่เคยตั้งค่าเป็น NULL (หรือ 'NULL' หรืออะไรก็ตาม) ดังนั้น is_array($arrCategoryCurr) ยังคงเป็นจริงอย่างไม่มีกำหนด ดังนั้นการวนซ้ำจึงไม่มีวันสิ้นสุด   -  person deceze♦    schedule 20.05.2019


คำตอบ (2)


ข้อมูล (ตัวอย่าง) ของคุณมีปัญหาตามการอ่านฟังก์ชันของคุณ

parentId และ index เหมือนกันในบางรายการ สิ่งนี้จะสร้างวงวนไม่สิ้นสุดตามสิ่งที่ฉันสามารถทำได้จากคำถาม

โครงสร้างที่ดีกว่าจะเป็นดังนี้ โดยมีการตรวจสอบข้อผิดพลาดในลูป:

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);
}

และทดสอบอาเรย์ตัวอย่างของคุณ

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

ส่งคืนสิ่งต่อไปนี้:

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

while (is_array($arrCategoryCurr)) วนซ้ำไม่สิ้นสุดเนื่องจากไม่มีการเรียกบล็อก else ของ $arrCategoryCurr = NULL;

สิ่งนี้เกิดขึ้นเนื่องจากคุณมีการวนซ้ำโดยที่รหัสโหนด เหมือนกับรหัสแม่ของเขา ดูอาร์เรย์ของคุณ:

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

หากต้องการแก้ไข ให้แก้ไขคำสั่ง if เป็น:

if ($arrCategoryCurr['parentId'] && $arrCategoryCurr['parentId'] != $arrCategoryCurr['id'] && isset($arrCategories[$arrCategoryCurr['parentId']])) {
person dWinder    schedule 20.05.2019
comment
ขอบคุณ @dWinder! ฉันเปลี่ยนรหัสของฉันแบบเดียวกับที่คุณเขียน! - person oshka; 20.05.2019