【问题标题】:Sort three level nested array in descending order with php用php按降序对三层嵌套数组进行排序
【发布时间】:2013-11-07 20:42:36
【问题描述】:

如何按sorder 对以下数组进行降序排序?整个数组被认为是一个用于降序排序的数组。我看到了一些其他类似的问题,但没有一个对我有帮助。

    Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [id] => 2208
                    [status] => u13333333333333
                    [user_id] => 6
                    [sorder] => 3

                )

            [1] => Array
                (
                    [id] => 2208
                    [status] => user111111111111111
                    [user_id] => 6
                    [sorder] => 1
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [id] => 2209
                    [status] => u222222222222222222222
                    [user_id] => 5
                    [sorder] => 2

                )

        )

)

编辑 可能这是二维数组的另一种形式。

Array
(
    [userPosts] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [id] => 2208
                            [status] => u13333333333333
                            [user_id] => 2208
                            [sorder] => 3
                        )

                    [1] => Array
                        (
                            [id] => 2208
                            [status] => user111111111111111
                            [user_id] => 2208
                            [sorder] => 1

                        )

                )

            [1] => Array
                (
                    [0] => Array
                        (
                            [id] => 2209
                            [status] => u222222222222222222222
                            [user_id] => 2209
                            [sorder] => 2

                        )

                )

        )

)

【问题讨论】:

  • 将第一个和第二个元素组合在一起,这样您将所有三个内部元素都放在一个数组中不是更好吗?之后您应该可以对其进行排序。
  • 在这种情况下不同的id...
  • @bibstha 怎么可以这样组合?
  • @Jamal 要么您只根据最里面的数组对元素进行排序(例如,将最里面的前两个数组在它们之间排序,然后第三个最里面的数组保持原样),或者将其转换为二维数组(将所有内部数组组合在一个父级下)并对其进行排序。你希望它如何排序?
  • @bibstha 我更新了问题,两种解决方案都可以,我更喜欢第二种解决方案。

标签: php arrays sorting multidimensional-array


【解决方案1】:
$yourArray = array(

                array(
                        array('id' => 2208,
                                'status' => 'u13333333333333',
                                'user_id' => 6,
                                'sorder'=>3
                        ),
                        array('id' => 2208,
                                'status' => 'user111111111111111',
                                'user_id' => 6,
                                'sorder'=>1
                        ),
                ),
                array(
                        array('id' => 2209,
                                'status' => 'u222222222222222222222',
                                'user_id' => 5,
                                'sorder'=>2
                        ),

                ),


);
/*Merger arrays as one */
function loopArrayMerger(array $bigArray) {
    if (!$bigArray) {
        return array();
    }

    return call_user_func_array('array_merge', $bigArray);
}
$flatedArray = loopArrayMerger($yourArray);
/*Call back function for sorting, if you want in ascending order just replace 1:-1 with -1:1*/
function compareElementsInArray($a, $b) {
    if ($a['sorder'] == $b['sorder']) {
        return 0;
    }
    return ($a['sorder'] < $b['sorder']) ? 1 : -1;
}

/*Finally sort your array*/
uasort($flatedArray, 'compareElementsInArray');
echo '<pre>';
print_r($flatedArray);

【讨论】:

    【解决方案2】:

    您想维护您的两个主要数组还是将它们合并为一个?这是一种与类似的组合成一体的解决方案:

    <?php
    
    // merge branches of array
    $array = array_merge($yourarray[0], $yourarray[1]);
    $sorders = array();
    
    foreach($array as $key => $current) {
        foreach($current as $subkey => $value) {
            // create new array with sorder as key, original key as value
            $sorders[$value['sorder']] = $subkey;   
        }
    }
    
    // sort by key (sorder)
    ksort($sorders);
    
    // create new array with ordered results
    $new_array = array();
    foreach($sorders as $sorder => $subkey) {
    
        // add values back
        $new_array[] = $array[0][$subkey];
    
    }
    
    print_r($new_array);
    
    ?>
    

    另一个问题是这个数组最初是如何创建的?您可能会发现生成它的任何东西(如果它是某种框架)可能会在检索按该字段排序的数据时为您提供选项。如果您使用自己的查询从 MySQL 中获取它,可能会更好地在 SQL 查询中按该字段排序,而不是在...之后执行它?

    【讨论】:

    • 我有两个用户当前用户和他的朋友,第一个数组是当前用户的数据,第二个数组是他的朋友数据(可以多个)。所以我必须在这里进行排序。它不是框架。
    • array_merge 这里只有两个数组,但最多可能是n 数组,如array_merge($yourarray[0], $yourarray[1]....$yourrray[n]);
    • 从这个例子中取出array_merge,将你的数组传递给第一个foreach,看看它是否适合你。如果你有一个像 userType 这样的名字作为你的第一个键,也将它传递到 foreach 中:foreach($yourarray['userType'] as ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2014-04-06
    • 1970-01-01
    • 2016-04-02
    • 2013-09-20
    • 1970-01-01
    • 2019-10-27
    相关资源
    最近更新 更多