Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用字符串递归搜索数组中的子字符串_Php_Arrays_String_Recursion - Fatal编程技术网

Php 使用字符串递归搜索数组中的子字符串

Php 使用字符串递归搜索数组中的子字符串,php,arrays,string,recursion,Php,Arrays,String,Recursion,对于下一个数组,每个子数组的键表示节点id(0)和类别名称(1)。 我要做的是查找每个子类别的父节点id。 例如,“3968976031”的父id为“10176091”,而“3968980031”的父id为“3968977031”。 为了定义谁是家长,我们必须查看类别: Küche&Haushalt/Heimtextilien,Bad-&Bettwaren/Babybettausstattung的父母是Küche&Haushalt/Heimtextilien,Bad-&Bettwaren 任

对于下一个数组,每个子数组的键表示节点id(0)和类别名称(1)。
我要做的是查找每个子类别的父节点id。

例如,“3968976031”的父id为“10176091”,而“3968980031”的父id为“3968977031”。
为了定义谁是家长,我们必须查看类别:
Küche&Haushalt/Heimtextilien,Bad-&Bettwaren/Babybettausstattung的父母是
Küche&Haushalt/Heimtextilien,Bad-&Bettwaren


任何形式的帮助都将不胜感激

array(6) { [0]=> array(2) { [0]=> string(8) "10176091" [1]=> string(48) "Küche & Haushalt/Heimtextilien, Bad- & Bettwaren" } [1]=> array(2) { [0]=> string(10) "3968976031" [1]=> string(68) "Küche & Haushalt/Heimtextilien, Bad- & Bettwaren/Babybettausstattung" } [2]=> array(2) { [0]=> string(10) "3968977031" [1]=> string(88) "Küche & Haushalt/Heimtextilien, Bad- & Bettwaren/Babybettausstattung/Babybettausstattung" } [3]=> array(2) { [0]=> string(10) "3968978031" [1]=> string(99) "Küche & Haushalt/Heimtextilien, Bad- & Bettwaren/Babybettausstattung/Babybettausstattung/Bettbezüge" } [4]=> array(2) { [0]=> string(10) "3968979031" [1]=> string(99) "Küche & Haushalt/Heimtextilien, Bad- & Bettwaren/Babybettausstattung/Babybettausstattung/Bettdecken" } [5]=> array(2) { [0]=> string(10) "3968980031" [1]=> string(104) "Küche & Haushalt/Heimtextilien, Bad- & Bettwaren/Babybettausstattung/Babybettausstattung/Bettwäsche-Sets" } } 阵列(6){ [0]=> 阵列(2){ [0]=> 串(8)“10176091” [1]=> 字符串(48)“Küche&Haushalt/Heimtextilien,Bad-和Bettwaren” } [1]=> 阵列(2){ [0]=> 字符串(10)“3968976031” [1]=> 字符串(68)“Küche&Haushalt/Heimtextilien,Bad-&Bettwaren/Babybettaustattung” } [2]=> 阵列(2){ [0]=> 字符串(10)“3968977031” [1]=> 字符串(88)“Küche&Haushalt/Heimtextilien,Bad-和Bettwaren/Babybettausstatung/Babybettaustatung” } [3]=> 阵列(2){ [0]=> 字符串(10)“3968978031” [1]=> 字符串(99)“Küche&Haushalt/Heimtextilien,Bad-&Bettwaren/Babybettaustattung/Babybettaustattung/Bettbezüge” } [4]=> 阵列(2){ [0]=> 字符串(10)“3968979031” [1]=> 字符串(99)“Küche&Haushalt/Heimtextilien,Bad-&Bettwaren/Babybettaustattung/Babybettaustattung/Bettdecken” } [5]=> 阵列(2){ [0]=> 字符串(10)“3968980031” [1]=> 字符串(104)“Küche&Haushalt/Heimtextilien,Bad-&Bettwaren/Babybettaustattung/Babybettaustattung/Bettwäsche集合” } } 使用foreach:

$seenCategories = array();
foreach($myArray as $key => $subArray) {

    $id = $subArray[0];
    $category = $subArray[1]; 
    // $category = Küche & Haushalt/Heimtextilien, Bad- & Bettwaren/Babybettausstattung/Babybettausstattung/Bettwäsche-Sets

    // saving category in order to be found as a parent in the future
    $seenCategories[$category] = $id;

    // parsing category in order to find parent
    $categoriesList = explode('/', $category);
    $nbSubCategories = count($categoriesList);
    // we remove the last subcategory (Bettwäsche-Sets) to find the parent
    unset($categoriesList[$nbSubCategories-1]);
    $parentCategory = implode("/", $categoriesList);
    // $parentCategory = Küche & Haushalt/Heimtextilien, Bad- & Bettwaren/Babybettausstattung/Babybettausstattung

    // deleted loop due to performence leak
    /*$parentId = null;
    for($testingKey = $key-1; $testingKey >= 0; $testingKey--) {
        if($parentCategory == $myArray[$testingKey][1]) {
            // we found the parent
            $parentId = $myArray[$testingKey][0];
            // let's exit loop
            break;
        }
    }*/

    // performence improvement
    // if we've already seen the parent, we get its id (we suppose a parent can't be after a children)
    if(array_key_exists($parentCategory, $seenCategories) {
        $parentId = $seenCategories[$parentCategory];
    } else {
        $parentId = null;
    }

    echo "id of item : $id, category : $category, parentId : $parentId";
}
编辑:


根据多斯先生的评论,业绩有所改善。谢谢。

如果子类始终跟随父类,并且数组仅包含树的一个分支,那么我们可以根据数组中每个子类别的前一个类别,非常轻松地获取每个子类别的父ID。这种方法比@Random的解决方案要有效得多,因为它不需要对每个子阵列的整个阵列进行第二次遍历,并且不涉及字符串操作

for ($i = 1; $i < count($categories); $i++)
{
    $id = $categories[$i][0];
    $name = $categories[$i][1];
    $parent_id = $categories[$i - 1][0];

    printf('ID: %s; category: %s; parent ID: %s',
           $id, $name, $parent_id);
}
for($i=1;$i
数组条目是否始终按此处所示的绝对降序排列?是的,它将遵循此模式。非常抱歉,我误导了您。编辑不正确。“3968980031”的父id为“3968977031”。您可以通过分析字符串来检查,方法是断开“/”@MihaiGabrielZamfir。我编辑了我的答案,因此我们正在寻找直接的父项。如果缺少,id将为空。此解决方案涉及对数组中的每个元素在整个数组上循环一次。从算法分析的角度来看,它被称为O(n^2)解。这是可行的,但它并没有达到应有的效率。一个主要的改进是构建一个关联数组,子类别名称作为键,节点ID作为值,然后在确定父类别后,使用它在该映射上执行查找,而不是再次遍历整个数组。@Mr.DOS I改进了性能,谢谢你的评论。问题是同一个家长可能有多个孩子,因此,
$i-1
可能是兄弟。。。您必须查看类别(其中包含/针对每个节点),在这种情况下,@Random的解决方案上的一个变体是您所能做的最好的。我将留下另一条评论,指出可能有重大改进。