0

我正在尝试对多维数组进行排序(事实上,它是多维的并不重要,因为我总是只对一维进行排序)。

function orderSort($a, $b) {
    if ($a['order'] == $b['order']) return 0;

    return($a['order'] < $b['order']) ? -1 : 1;
}

$nav = array(
    "section" => array(
        "header" => array(),
        "main" => array()
    ),
    "link" => array(
        "header" => array(),
        "main" => array()
    )
);

$DATA = array(
    array(
        "type" => "section",
        "subtype" => "main",
        "data" => array("name" => "/Basic", "order" => 1, "parent" => "bbb")
    ),
    array(
        "type" => "link",
        "subtype" => "main",
        "data" => array("name" => "Home", "link" => array("/"), "order" => 1, "parent" => "/Basic")
    )
);

foreach($DATA as $ele) {
    if(!array_key_exists($ele['data']['parent'], $nav[$ele['type']][$ele['subtype']]))
        $nav[$ele['type']][$ele['subtype']][$ele['data']['parent']] = array($ele['data']);
    else
        array_push($nav[$ele['type']][$ele['subtype']][$ele['data']['parent']], $ele['data']);
    }

var_dump($nav['section']['main']);
echo '<br><br>';

foreach($nav['section']['main'] as $ele) {
    uasort($ele, 'orderSort');
    $nav['section']['main'] = $ele;
}

var_dump($nav['section']['main']);

第一个var_dump返回:

array(1) { 
    ["bbb"]=> array(1) { 
        [0]=> array(3) { 
            ["name"]=> string(6) "/Basic" 
            ["order"]=> int(1) ["parent"]=> string(3) "bbb" 
        } 
    } 
} 

如您所见,有一个名为bbb(对不起……高度概念化的键)。现在第二个输出:

array(1) { 
    [0]=> array(3) { 
        ["name"]=> string(6) "/Basic" 
        ["order"]=> int(1) 
        ["parent"]=> string(3) "bbb" 
    } 
}

突然bbb就没了。事实上,整个数组(只有一个元素)已经消失了。

我的问题是,我能以某种方式阻止这种情况发生吗?我从来没有要求过这种优化。当然,仅使用一个元素对其进行排序没有任何意义,但仍然如此。

4

2 回答 2

1
foreach($nav['section']['main'] as $ele) {
    uasort($ele, 'orderSort');
    $nav['section']['main'] = $ele;
}

好的。哪个是关键?您只是忘记了键(您正在用新数组而不是原始数组本身覆盖原始数组的父级):

foreach($nav['section']['main'] as $key => $ele) {
    uasort($ele, 'orderSort');
    $nav['section']['main'][$key] = $ele;
}

会是正确的,但通过参考甚至更好:

foreach($nav['section']['main'] as &$ele) {
    uasort($ele, 'orderSort');
}
于 2013-07-02T18:33:48.500 回答
0

你的问题在这里:

foreach($nav['section']['main'] as $ele) {
    uasort($ele, 'orderSort');
    $nav['section']['main'] = $ele;
}

这需要

foreach($nav['section']['main'] as $index => $ele) {
    uasort($ele, 'orderSort');
    $nav['section']['main'][$index] = $ele;
}

您正在用第一个元素替换整个 $nav['section']['main'] 。

于 2013-07-02T18:33:26.373 回答