Почему не хватает памяти в простейшем цикле с массивом из 3 элементов? - PullRequest
2 голосов
/ 20 мая 2019

Есть функция, которая отображает категории в самом верху:

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

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

Цикл while (is_array($arrCategoryCurr)) никогда не заканчивается, так как блок else для $arrCategoryCurr = NULL; никогда не вызывается.

Это происходит потому, что у вас есть цикл, в котором идентификатор узла совпадает с идентификатором его родителя . Посмотрите на ваш массив:

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

Чтобы исправить это, измените оператор if на:

if ($arrCategoryCurr['parentId'] && $arrCategoryCurr['parentId'] != $arrCategoryCurr['id'] && isset($arrCategories[$arrCategoryCurr['parentId']])) {
0 голосов
/ 20 мая 2019

Ваши (примерные) данные имеют проблему из-за моего прочтения вашей функции.

* 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...