按自定义顺序排序数组

时间:2015-01-27 21:52:58

标签: php arrays wordpress sorting

我需要以自定义方式对数组进行排序。目前,阵列设置如下:

array(3) {
  ["appetizer"]=>
  array(1) {
    ["slug"]=>
    string(9) "appetizer"
  }
  ["dessert"]=>
  array(1) {
    ["slug"]=>
    string(7) "dessert"
  }
  ["main"]=>
  array(1) {
    ["slug"]=>
    string(4) "main"
  }

我需要将数组的顺序从字母顺序(当前顺序)更改为自定义顺序。

目前它是这样的:app / dessert / main。 我需要它成为app / main / dessert。

不确定如何将阵列更新为新的自定义订单。我与uksort()混淆了但是并没有真正走得太远。

这是then函数,它生成当前数组及其顺序(按字母顺序排列)

function sort_dish_terms($term = array()){
    $tax = get_terms( $term ) ;
    $data = array();
    foreach ($tax as $t => $k) {
        // $name = $k->name;
        $slug = $k->slug;   
        $data[$slug] = array(
            'slug'  => $slug
        );  
    }
    return $data;
}

3 个答案:

答案 0 :(得分:1)

在我看来,这是一个更优雅的解决方案,只使用3行来进行实际排序(或者,如果您愿意,也可以是一行)。使用PHP的uksort

<?php

$priorities = array(
    "appetizer" => 1,
    "main"      => 2,
    "dessert"   => 3
);

$array = array(
    "appetizer" => array(
        "slug" => "appetizer"
    ),

    "dessert" => array(
        "slug" => "dessert"
    ),

    "main" => array(
        "slug" => "main"
    )
);

var_dump($array);

uksort($array, function($a, $b) use($priorities) {
    return $priorities[$a] > $priorities[$b];
});

var_dump($array);

?>

将导致:

array(3) {
  ["appetizer"]=>
  array(1) {
    ["slug"]=>
    string(9) "appetizer"
  }
  ["dessert"]=>
  array(1) {
    ["slug"]=>
    string(7) "dessert"
  }
  ["main"]=>
  array(1) {
    ["slug"]=>
    string(4) "main"
  }
}
array(3) {
  ["appetizer"]=>
  array(1) {
    ["slug"]=>
    string(9) "appetizer"
  }
  ["main"]=>
  array(1) {
    ["slug"]=>
    string(4) "main"
  }
  ["dessert"]=>
  array(1) {
    ["slug"]=>
    string(7) "dessert"
  }
}

工作示例:http://codepad.viper-7.com/OeMLhD

答案 1 :(得分:0)

我会在生成数组之前确定所需的顺序来解决这个问题。如下所示:

$priorities = [
    'appetizer',
    'main',
    'dessert'
];

/*
 * The $items array is generated by the function you provided.
 */
$items = [
    'appetizer' => [
        'slug' => 'appetizer'
    ],
    'dessert' => [
        'slug' => 'dessert'
    ],
    'main' => [
        'slug' => 'main'
    ]
];

然后我创建了一个可以在这种情况下使用的函数。

function sort_by_priorities(array $priorities, array $items) {

    /*
     * Check if the two arrays are populated.
     */
    if(empty($priority) || empty($items)) {
        throw new LogicException('Parameters $priorities and $items cannot be empty.');
    }

    $sorted = [];

    /*
     * Ensure all array keys are lowercase for better comparison.
     */
    $items = array_change_key_case($items, CASE_LOWER);

    foreach($priorities as $priority) {

        $priority = strtolower($priority);

        if(array_key_exists($priority, $items)) {

            $sorted[$priority] = $items[$priority];

        }

    }

    return $sorted;

}

然后调用该函数,您应该会收到所需的订单。

$sorted = sort_by_priorities($priorities, $items);

这将使用var_dump()提供如下数组:

array (size=3)
  'appetizer' => 
    array (size=1)
      'slug' => string 'appetizer' (length=9)
  'main' => 
    array (size=1)
      'slug' => string 'main' (length=4)
  'dessert' => 
    array (size=1)
      'slug' => string 'dessert' (length=7)

如果您愿意,可以延长。如果两个数组中的数组元素数量相等,则此函数的当前版本并不关心,这可能对您有用,也可能没有用。

希望这有帮助。

答案 2 :(得分:0)

因为您的第一级键都是已知的并且始终存在,所以只需翻转您的排序数组并将其值替换为实际值即可。

代码:(Demo

$order = ['appetizer', 'main', 'dessert'];

$items = [
    'appetizer' => ['slug' => 'appetizer'],
    'dessert' => ['slug' => 'dessert'],
    'main' => ['slug' => 'main']
];
var_export(
    array_replace(array_flip($order), $items)
);

输出:

array (
  'appetizer' => 
  array (
    'slug' => 'appetizer',
  ),
  'main' => 
  array (
    'slug' => 'main',
  ),
  'dessert' => 
  array (
    'slug' => 'dessert',
  ),
)