假设我有这个数组:
$array = array(
array("id" => 7867867, "animal" => "Dog"),
array("id" => 3452342, "animal" => "Lion"),
array("id" => 1231233, "animal" => "Lion"),
array("id" => 5867867, "animal" => "Dog"),
array("id" => 1111111, "animal" => "Zeebra"),
array("id" => 2222222, "animal" => "Cat"),
array("id" => 3333333, "animal" => "Cat"),
array("id" => 4444444, "animal" => "Zeebra")
);
现在,我一直在尝试使用php排序函数,以便能够根据特定的规则(而不是按字母顺序)对其进行排序
客户希望这些信息按"狮子第一,狗第二,Zeebra第三,猫第四"排序。
类似这样的东西:
$array = array(
array("id" => 3452342, "animal" => "Lion"),
array("id" => 1231233, "animal" => "Lion"),
array("id" => 7867867, "animal" => "Dog"),
array("id" => 5867867, "animal" => "Dog"),
array("id" => 4444444, "animal" => "Zeebra"),
array("id" => 1111111, "animal" => "Zeebra"),
array("id" => 2222222, "animal" => "Cat"),
array("id" => 3333333, "animal" => "Cat"),
);
数组将使用"animal"值进行排序,并基于预先确定的规则。
我试图弄清楚php排序函数,但我只能用它们按字母顺序或数字顺序对数组进行排序。
我要做的是一组if语句和循环,我想尽快摆脱那些慢代码。
使用Jonathan关于使用usort的建议,您可以在单独的函数中定义自定义排序规则,如:
function getAnimalValue($animal) {
switch($animal) {
case 'Lion':
return 1;
case 'Dog':
return 2;
case 'Zeebra':
return 3;
case 'Cat':
return 4;
}
return 0;
}
然后,实现您自己的比较功能:
function compare($itemA, $itemB) {
$a = getAnimalValue($itemA['animal']);
$b = getAnimalValue($itemB['animal']);
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
最后,使用compare函数调用usort:
usort($array, "compare");
PHP7提供了"太空船操作员",使排序变得非常简单。
以下所有代码段都将利用查找数组来确定自定义排序顺序。
$priorities = array_flip(['Lion', 'Dog', 'Zeebra', 'Cat']);
代码:(演示)
usort($array, function($a, $b) use ($priorities) {
return $priorities[$a['animal']] <=> $priorities[$b['animal']];
});
PHP7.4+代码:(演示)
usort($array, fn($a, $b) => $priorities[$a['animal']] <=> $priorities[$b['animal']]);
您的问题和样本数据表明,您总是在查找数组中确认所有动物。如果这并不总是正确的,那么您需要在自定义函数中进行isset()
调用,并确定是否希望将丢失的动物放在列表的前面或后面。
上面的两个片段都提供了相同的输出:
array (
0 =>
array (
'id' => 3452342,
'animal' => 'Lion',
),
1 =>
array (
'id' => 1231233,
'animal' => 'Lion',
),
2 =>
array (
'id' => 7867867,
'animal' => 'Dog',
),
3 =>
array (
'id' => 5867867,
'animal' => 'Dog',
),
4 =>
array (
'id' => 1111111,
'animal' => 'Zeebra',
),
5 =>
array (
'id' => 4444444,
'animal' => 'Zeebra',
),
6 =>
array (
'id' => 2222222,
'animal' => 'Cat',
),
7 =>
array (
'id' => 3333333,
'animal' => 'Cat',
),
)
检查usort。参考号:
http://www.php.net/manual/en/function.usort.php
示例:
function cmp($a, $b) {
$order=array("Lion","Dog","Zebra","Cat");
if ($a["animal"] == $b["animal"]) {
return 0;
}
return (array_search($a["animal"],$order) < array_search($b["animal"],$order)) ? -1 : 1;
}
$array = array(
array("id" => 7867867, "animal" => "Dog"),
array("id" => 3452342, "animal" => "Lion"),
array("id" => 1231233, "animal" => "Lion"),
array("id" => 5867867, "animal" => "Dog"),
array("id" => 1111111, "animal" => "Zebra"),
array("id" => 2222222, "animal" => "Cat"),
array("id" => 3333333, "animal" => "Cat"),
array("id" => 4444444, "animal" => "Zebra")
);
$mySortedArray=usort($array, "cmp");
这是一种有点丑陋的方式,但它确实有效。
// Set our rules, the key is the order
$rules = array(0=>"Dog",1=>"Lion",2=>"Zeebra",3=>"Cat");
// Our array
$array = array(
array("id" => 7867867, "animal" => "Dog"),
array("id" => 3452342, "animal" => "Lion"),
array("id" => 1231233, "animal" => "Lion"),
array("id" => 5867867, "animal" => "Dog"),
array("id" => 1111111, "animal" => "Zeebra"),
array("id" => 2222222, "animal" => "Cat"),
array("id" => 3333333, "animal" => "Cat"),
array("id" => 4444444, "animal" => "Zeebra")
);
// Split each animal into a arrays per animal
foreach( $array as $item ){
$animals[ $item['animal'] ][] = $item;
}
// Loop our rules (dogs, then lions, etc) and put our mini arrays in a final sorted_array.
foreach( $rules as $animal_order => $animal_name ){
foreach( $animals[$animal_name] as $animal ){
$sorted_animals[] = $animal;
}
}
print_r($sorted_animals);
尝试:
function sortByAnimals($array, $animalOrderArray){
foreach($animalOrderArray as $v){
$aa[$v] = array();
}
foreach($array as $a){
foreach($aa as $i => $v){
if(preg_match("/^{$a['animal']}$/i", $i)){
array_push($aa[$i], $a);
break;
}
}
}
foreach($aa as $a){
foreach($a as $v){
$r[] = $v;
}
}
return $r;
}
$resArray = sortByAnimals($array, array('lion', 'dog', 'zeebra', 'cat'));