如何以自定义方式对多维数组进行排序

时间:2016-07-12 15:34:16

标签: php arrays sorting multidimensional-array

我正在尝试重新排列基于自定义排列键的多维数组,因为我正在使用jQuery可排序插件。我读了usort,ksort和其他但是那些按降序或升序排序,但是在自定义排列的键上。 我读了uasort bu我不明白如何实现这个。

 $original_array = 
  array(      
    'one' => array
        (
            'url' => 'home.php',
            'title' => 'Home',
            'permission' => array
                    (
                        'administrator' => yes,
                        'manager' => yes
                    )
        ),
    'two' => array
        (
            'url' => 'entries.php',
            'title' => 'Entries',
            'permission' => array
                (
                    'administrator' => yes,
                    'manager' => yes,
                )

        ),
      'three' => array
        (
            'url' => 'stock.php',
            'title' => 'Stock',
            'permission' => array
                (
                    'administrator' => 'yes',
                    'manager' => 'yes',
                )
        ),
    'four' => array
        (
            'url' => 'products.php',
            'title' => 'Products',
            'permission' => array
                (
                    'administrator' => yes,
                    'manager' => yes,
                )
        ),
      'five' => array
        (
            'url' => 'prices.php',
            'title' => 'Prices',
            'permission' => array
                (
                    'administrator' => yes,
                    'manager' => yes,
                )
        ),
    );

数组按此顺序排列

$custom_array_to_be_arranged = 
  array(
      'three' => array
        (
            'url' => 'stock.php',
            'title' => 'Stock',
            'permission' => array
                (
                    'administrator' => 'yes',
                    'manager' => 'yes',
                )
        ),
    'one' => array
        (
            'url' => 'home.php',
            'title' => 'Home',
            'permission' => array
                    (
                        'administrator' => yes,
                        'manager' => yes
                    )
        ),      
    'five' => array
        (
            'url' => 'prices.php',
            'title' => 'Prices',
            'permission' => array
                (
                    'administrator' => yes,
                    'manager' => yes,
                )
        ),
    'two' => array
        (
            'url' => 'entries.php',
            'title' => 'Entries',
            'permission' => array
                (
                    'administrator' => yes,
                    'manager' => yes,
                )

        ),
    'four' => array
        (
            'url' => 'products.php',
            'title' => 'Products',
            'permission' => array
                (
                    'administrator' => yes,
                    'manager' => yes,
                )
        )
    );

任何帮助将不胜感激。感谢。

2 个答案:

答案 0 :(得分:2)

如果您有自定义排序顺序的键数组,可以通过多种方法将其应用于要排序的数组。

执行此操作的一种方法是,而不是使用排序函数,方法是通过循环排序顺序数组并从原始数组中提取相应的值来创建新的排序数组。

$custom_keys = array('three', 'one', 'five', 'two', 'four');

foreach ($custom_keys as $key) {
    if (isset($original_array[$key])) {
        $sorted[$key] = $original_array[$key];      
    }
}

如果您确实想使用排序函数而不是创建新数组,请在比较回调中使用uksortuse自定义排序数组。您可以使用array_search查找密钥的正确顺序。

$custom_keys = array('three', 'one', 'five', 'two', 'four');

uksort($original_array, function($a, $b) use ($custom_keys) {
    $apos = array_search($a, $custom_keys);
    $bpos = array_search($b, $custom_keys);
    if ($apos < $bpos) return -1;
    if ($apos > $bpos) return 1;
    return 0;
});

答案 1 :(得分:1)

如果它可以是完全随机的(或者更确切地说是根据列表预定义),我猜你可以为它创建一个自定义函数。

function customSort(array $newOrder, array $currentArray)
{
    $new = [];
    foreach($newOrder as $key) {
        if (array_key_exists($key, $currentArray)) {
            $new[$key] = $currentArray[$key];
        }
    }

    return $new;
}

用法:

$newOrder     = ['three', 'one', .... ];
$currentArray = ['one' => ..., 'two' => ...];

$newSortedArray = customSort($newOrder, $currentArray);

通过这种方式,您可以获得一个新数组,其排序顺序与$newOrder列表相同。