PHP按值排序超级数组

时间:2014-02-22 04:50:23

标签: php arrays sorting multidimensional-array

我正在寻找一些建议如何通过'variant_name'键对这种数组进行排序。

因为Array非常庞大,所以我把它缩小到了结果状态。

    ...
    $filter[2413][1][81][sub_id] = 1;
    $filter[2413][1][81][variant_id] = 81;
    $filter[2413][1][81][variant_name] = 'Banana';

    $filter[2413][2][87][sub_id] = 2;
    $filter[2413][2][87][variant_id] = 87;
    $filter[2413][2][87][variant_name] = 'Apple';

    $filter[2413][3][32][sub_id] = 3;
    $filter[2413][3][32][variant_id] = 32;
    $filter[2413][3][32][variant_name] = 'Carrot';
    ...

$filter[x][x][x]不是连续的。

我已经尝试了之前使用过的sort函数,但它不能用于这种数组:

function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) {
    $sort_col = array();
    foreach ($arr as $key=> $row) {
        $sort_col[$key] = $row[$col];
    }
    array_multisort($sort_col, $dir, $arr);
}
array_sort_by_column($filter[][][], 'variant_name');

我的目标是通过将'variant_name'排序为'Apple','Banana','Carrot'来相应地保持数组结构来修改数组。

1 个答案:

答案 0 :(得分:1)

这是一个根据给定示例测试的工作代码。

请注意,我的代码仍然可以进行优化等等。只需将其作为我的建议。

TL; DR =使用usort()

function mySort($a,$b)
{
    $av = "";
    $bv = "";

    foreach($a as $ak)
        $av = $ak['variant_name'];

    foreach($b as $bk)
        $bv = $bk['variant_name'];

    if($av[0] < $bv[0])
        return false;
    else return true;
}

如何使用它?您必须指定要排序的第一级数组。

usort($filter['2413'],"mySort");

然后我得到的结果是:

Array
(
    [2413] => Array
    (
        [0] => Array
        (
            [87] => Array
            (
                [sub_id] => 2
                [variant_id] => 87
                [variant_name] => Apple
            )
        )

        [1] => Array
        (
            [81] => Array
            (
                [sub_id] => 1
                [variant_id] => 81
                [variant_name] => Banana
            )
        )

        [2] => Array
        (
            [32] => Array
            (
                [sub_id] => 3
                [variant_id] => 32
                [variant_name] => Carrot
            )
        )
    )
)