Php 使用字符串递归搜索数组中的子字符串
对于下一个数组,每个子数组的键表示节点id(0)和类别名称(1)。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。
例如,“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的解决方案上的一个变体是您所能做的最好的。我将留下另一条评论,指出可能有重大改进。