为什么在最简单的循环和 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);


子衿沉夜
浏览 148回答 2
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"

一只萌萌小番薯

该while (is_array($arrCategoryCurr))循环永远不会结束的else块$arrCategoryCurr = NULL;永远不会被调用。发生这种情况是因为您有一个循环,其中节点 id与其父 id 相同。看看你的数组:....'id' => '193450','parentId' => '193450',...要修复它,请将if语句修改为:if ($arrCategoryCurr['parentId'] && $arrCategoryCurr['parentId'] != $arrCategoryCurr['id'] && isset($arrCategories[$arrCategoryCurr['parentId']])) {
打开App,查看更多内容
随时随地看视频慕课网APP