我需要以自定义方式对数组进行排序。目前,阵列设置如下:
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;
}
答案 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"
}
}
答案 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',
),
)