按自定义顺序对php数组进行排序
我有一个数组:按自定义顺序对php数组进行排序,php,arrays,multidimensional-array,sorting,Php,Arrays,Multidimensional Array,Sorting,我有一个数组: Array ( [0] => Array ( [id] = 7867867, [title] = 'Some Title'), [1] => Array ( [id] = 3452342, [title] = 'Some Title'), [2] => Array ( [id] = 1231233, [title] = 'Some Title
Array (
[0] => Array (
[id] = 7867867,
[title] = 'Some Title'),
[1] => Array (
[id] = 3452342,
[title] = 'Some Title'),
[2] => Array (
[id] = 1231233,
[title] = 'Some Title'),
[3] => Array (
[id] = 5867867,
[title] = 'Some Title')
)
需要按特定顺序进行:
非常感谢您的帮助。您需要定义自己的比较函数并使用or,如果您想维护索引关联。您可以使用
usort()
来精确指示数组的排序方式。在这种情况下,可以在比较函数中使用$order
数组
下面的例子使用了一个简单的方法来简化生活
$order = array(3452342, 5867867, 7867867, 1231233);
$array = array(
array('id' => 7867867, 'title' => 'Some Title'),
array('id' => 3452342, 'title' => 'Some Title'),
array('id' => 1231233, 'title' => 'Some Title'),
array('id' => 5867867, 'title' => 'Some Title'),
);
usort($array, function ($a, $b) use ($order) {
$pos_a = array_search($a['id'], $order);
$pos_b = array_search($b['id'], $order);
return $pos_a - $pos_b;
});
var_dump($array);
这项工作的关键是要有被比较的值,即id
s在$order
数组中的位置
比较功能的工作原理是在$order
数组中查找要比较的两个项目的ID的位置。如果$a['id']
在$order
数组中位于$b['id']
之前,则函数的返回值将为负值($a
较小,因此“浮动”到顶部)。如果$a['id']
位于$b['id']
之后,则函数返回一个正数($a
较大,因此“下沉”)
最后,使用闭包没有特殊的原因;这只是我快速编写这些一次性函数的方法。它同样可以使用普通的命名函数。扩展此附加要求:
现在,当我将项目添加到数组而不是排序时会发生什么?我
不要在意它们出现的顺序,只要它们在后面
我确实指明了
您需要在排序函数中添加两个附加条件:
$order=array(
3452342,
5867867,
7867867,
1231233
);
$array=array(
数组(“id”=>7867867,“title”=>“必须是#3”),
数组(“id”=>3452342,“title”=>“必须为#1”),
数组(“id”=>1231233,“title”=>“必须是#4”),
数组(“id”=>5867867,“title”=>“必须是#2”),
数组(“id”=>1111111,“title”=>Dont Care#1”),
数组(“id”=>2222222,“title”=>Dont Care#2”),
数组(“id”=>3333333,“title”=>Don Care#3”),
数组(“id”=>444,“title”=>Dont Care#4”)
);
洗牌($array);//用于测试
变量转储($array);//之前
usort($array,function($a,$b)use($order){
$a=数组搜索($a[“id”],$order);
$b=数组搜索($b[“id”],$order);
如果($a==false&&$b==false){//这两项都不重要
返回0;//a==b
}否则如果($a==false){/$a是一个不关心的
返回1;//$a>$b
}否则,如果($b===false){/$b是a,则不必在意
返回-1;//$a<$b
}否则{
返回$a-$b;//对$a和$b升序排序
}
});
变量转储($array);//之后
输出:
之前|之后
-------------------------------+-------------------------------
数组(8){|数组(8){
[0]=> | [0]=>
数组(2){|数组(2){
[“id”]=>
内部(444)|内部(3452342)
[“标题”]=>|[“标题”]=>
字符串(12)“不在乎4”字符串(10)“必须是1”
} | }
[1]=> | [1]=>
数组(2){|数组(2){
[“id”]=>
国际(3333333)|国际(5867867)
[“标题”]=>|[“标题”]=>
字符串(12)“不在乎3”字符串(10)“必须是2”
} | }
[2]=> | [2]=>
数组(2){|数组(2){
[“id”]=>
国际(1231233)|国际(7867867)
[“标题”]=>|[“标题”]=>
字符串(10)“必须是#4”|字符串(10)“必须是#3”
} | }
[3]=> | [3]=>
数组(2){|数组(2){
[“id”]=>
内部(1111111)|内部(1231233)
[“标题”]=>|[“标题”]=>
字符串(12)“不在乎1”字符串(10)“必须是4”
} | }
[4]=> | [4]=>
数组(2){|数组(2){
[“id”]=>
国际(5867867)|国际(2222222)
[“标题”]=>|[“标题”]=>
字符串(10)“必须是#2”|字符串(12)“不在乎#2”
} | }
[5]=> | [5]=>
数组(2){|数组(2){
[“id”]=>
国际(2222222)|国际(1111111)
[“标题”]=>|[“标题”]=>
字符串(12)“不在乎2”字符串(12)“不在乎1”
} | }
[6]=> | [6]=>
数组(2){|数组(2){
[“id”]=>
内部(3452342)|内部(3333333)
[“标题”]=>|[“标题”]=>
字符串(10)“必须是#1”|字符串(12)“不在乎#3”
} | }
[7]=> | [7]=>
数组(2){|数组(2){
[“id”]=>
国际(7867867)|国际(444)
[“标题”]=>|[“标题”]=>
圣
//tournament with goal to be first in array
usort($champions, function ($home, $away) use ($order) {
$home_attribute = array_search($a['id'], $order);
$away_attribute = array_search($b['id'], $order);
//fight with desired outcome for home being negative and away desiring positive
return $home_attribute - $away_attribute;
});
// restructure with values as keys, and keys as order (ASC)
$order = array_flip([3452342, 5867867, 7867867, 1231233]);
// generating $order = [3452342 => 0, 5867867 => 1, 7867867 => 2, 1231233 => 3];
$default = count($order);
// generating $default = 4
usort($array, function($a, $b) use($order, $default) {
return ($order[$a['id']] ?? $default) <=> ($order[$b['id']] ?? $default);
});
var_export($array);
$order = array(3452342, 5867867, 7867867, 1231233);
$array = array(
array('id' => 7867867, 'title' => 'Some Title'),
array('id' => 3452342, 'title' => 'Some Title'),
array('id' => 1231233, 'title' => 'Some Title'),
array('id' => 5867867, 'title' => 'Some Title'),
);
$order = array_flip($order);
$array = array_column($array,null,"id");
$result = array_replace($order,$array);
var_dump(array_values($result));
$order = array(3452342, 5867867, 7867867, 1231233);
$array = array(
array('id' => 7867867, 'title' => 'Some Title'),
array('id' => 3452342, 'title' => 'Some Title'),
array('id' => 1231233, 'title' => 'Some Title'),
array('id' => 5867867, 'title' => 'Some Title'),
);
$order_dict = array_flip($order);
$order_dict = array_combine($order, array_fill(0, count($order), []));
foreach($array as $item){
$order_dict[$item["id"]][] = $item;
}
//$order_dict = array_filter($order_dict); // if there is empty item on some id in $order array
$result = [];
foreach($order_dict as $items){
foreach($items as $item){
$result[] = $item;
}
}
var_dump($result);
fastsort about 1 ms
mediumsort about 3 ms
slowsort about 60 ms