php2d数组排序父-子


php 2d array sort parent child


是的,是的,我知道,这里有很多关于数组排序的问题,但我需要一个更具体的解释
我有一个DB表来存储产品的多级菜单
比如:itemId,parentId,itemtitle
我用这个表在网页上构建菜单,使用reccurive函数,我想用这个DB表来获取后端html表单的数据,用于选项列表。DB中未排序的数据我需要正确排序并放入json数组中。我用这个做了一半的工作:

//empty arrays for sorting purposes  
$ids = array();
$parents = array();
// iterate, $items - unsorted array from DB 
foreach ($items as $key => $row) {
    $ids[$key]  = $row['itemId'];
    $parents[$key] = $row['parentId'];
}
// sorting
array_multisort($ids, SORT_ASC, $parents, SORT_ASC, $items);
//now $items partly sorted

图1
因此$items列表如下所示:
(itemId-parentId-itemTitle(
1-0-***A
2-0-***B
3-0-***C
4-0-***D
6-1-***E
7-1-***F
8-1-***G
9-2-***H
10-2-***我
11-2-***J
12-2-***K
13-2-***L
14-3-***M
15-3-***N
16-3-***O
17-4-***P
18-4-***Q

图2
我需要:
1-0-***A
6-1-***E
7-1-***F
8-1-***G
2-0-***B
9-2-***H
10-2-***我
11-2-***J
12-2-***K
13-2-***L
3-0-***C
14-3-***M
15-3-***N
16-3-***O
4-0-***D
17-4-***P
18-4-***Q

所以问题是——如何以简洁的方式将数组从图1转换为图2的数组

所以这是我的荣幸。仅限两级菜单:

    //get all categories, primary sorted by MySQL
    $items = $cataloAR->query("SELECT itemId, parentId,itemTitle FROM `catalog` ORDER BY parentId, itemId"); 
//pre-sort by - itemId, parentId
    $ids = array();//array for id`s
    $parents = array();//array for parents
// get columns list
    foreach ($items as $key => $row) {
        $ids[$key]  = $row['itemId'];
        $parents[$key] = $row['parentId'];
    }
// sort ascending by id, ascending by parent
    array_multisort($ids, SORT_ASC, $parents, SORT_ASC, $items);
//make emptyarray for sorteddata, like - $entryList['itemId']['itemTitle'] 
    $entryList = array();//empty array
    $len = count($items); //count elements for proceeding
    $currentEntry = 0;  //current element number,start from 0-element
//iterate
//while reaching last element in list
   while($currentEntry < $len){        
//if current element is empty => go to next element
        if (!isset($items[$currentEntry])) {
            $currentEntry++;
        } 
 //get current element from $items
//put it to $entryList
        $entryList[] = $items[$currentEntry];    
// get current id 
        $currentId = $items[$currentEntry]['itemId'];        
//remove element from  $items, because we just put it to the sorted list
        unset($items[$currentEntry]);     
//search in $items entries with  patternId = $items['itemId']  
//put to sorted list
//remove element 
        foreach ($items as $key => $value) {
            if($value['parentId'] == $currentId){
                $entryList[] = $value;               
                unset($items[$key]);                  
            } 
            if (!isset($value)){
                continue;
            }
        } 
//increase counter               
            $currentEntry++;                   
    }    
//purge sorted list from empty elements  $entryList
    $sortedList = array_filter($entryList);
 //Enjoy it!
    return $sortedList;

我对您的数组做了一些假设,并用下面的代码创建了它。我能够通过创建两个新数组($root和$menu(来复制所需的输出,然后循环遍历每个数组来构建菜单。这很棘手,最好的答案实际上是从一开始就以不同的方式构建这个阵列,但如果这不可能,这段代码应该会让你到达你需要的地方:

$items[] = array('itemId' => 1,'parentId' => 0,'itemTitle' => '***A');
$items[] = array('itemId' => 2,'parentId' => 0,'itemTitle' => '***B');
$items[] = array('itemId' => 3,'parentId' => 0,'itemTitle' => '***C');
$items[] = array('itemId' => 4,'parentId' => 0,'itemTitle' => '***D');
$items[] = array('itemId' => 6,'parentId' => 1,'itemTitle' => '***E');
$items[] = array('itemId' => 7,'parentId' => 1,'itemTitle' => '***F');
$items[] = array('itemId' => 8,'parentId' => 1,'itemTitle' => '***G');
$items[] = array('itemId' => 9,'parentId' => 2,'itemTitle' => '***H');
$items[] = array('itemId' => 10,'parentId' => 2,'itemTitle' => '***I');
$items[] = array('itemId' => 11,'parentId' => 2,'itemTitle' => '***J');
$items[] = array('itemId' => 12,'parentId' => 2,'itemTitle' => '***K');
$items[] = array('itemId' => 13,'parentId' => 2,'itemTitle' => '***L');
$items[] = array('itemId' => 14,'parentId' => 3,'itemTitle' => '***M');
$items[] = array('itemId' => 15,'parentId' => 3,'itemTitle' => '***N');
$items[] = array('itemId' => 16,'parentId' => 3,'itemTitle' => '***O');
$items[] = array('itemId' => 17,'parentId' => 4,'itemTitle' => '***P');
$items[] = array('itemId' => 18,'parentId' => 4,'itemTitle' => '***Q');
foreach ($items as $itemArray) {
    $parent = $itemArray['parentId'];
    $item = $itemArray['itemId'];
    $title = $itemArray['itemTitle'];
    if ($parent == 0) {
        // this is a root item
        $root[$item] = $title;
    } else {
        // this is a submenu item
        $menu[$parent][$item] = $title;
    }
}
foreach ($root as $key => $value) {
    // this is a root item, which is always 0.
    echo "$key, 0, $value <br/>";
    foreach ($menu as $parent => $item) {
        if ($parent == $key) {
            foreach ($item as $itemId => $title) {
                // output the submenu items under the root
                echo "$itemId, $parent, $title <br />";
            }
        }
    }
}