#php #arrays #sorting
#php #массивы #сортировка
Вопрос:
Array (
[1090] => BENNETON
[6761] => BENNETON
[3963] => BENNETON
[1662] => BENNETON
[1099] => BENNETON
[694] => XELOLE
[2527] => XELOLE
[4553] => XELOLE
[7908] => XELOLE
[4787] => XELOLE
[8261] => GOLDEN
[8259] => GOLDEN
[8265] => GOLDEN
[2599] => VICTORYE
[860] => VICTORYE
[1117] => VICTORYE
[844] => VICTORYE
[2243] => MIMIC
[1035] => MIMIC
[1025] => MIMIC
[561] => MIMIC
[621] => MIMIC
[2404] => OPTIMUM
[2389] => OPTIMUM
[2396] => OPTIMUM
[1965] => OPTIMUM
[2403] => OPTIMUM
Как я могу сделать так, чтобы все элементы со значением ИМИТИРОВАЛИ (и ключ), были первыми в массиве, за ними следовали все с ЗОЛОТЫМ, затем все остальные элементы?
Ответ №1:
Вы можете использовать uasort
для реализации пользовательской функции сортировки. Что-то вроде этого будет работать:
//$sortMe = your array
uasort($sortMe, function($a, $b){
if ($a === $b) { //if both values are the same
return 0; //don't change their position
}
if ($a === 'MIMIC' || $b === 'MIMIC') { //If either a or b are MIMIC (a and b can't both be MIMIC since that would have met our previous return condition
return $a === 'MIMIC' ? 1:-1; //If a is "MIMIC" it should be first, otherwise put b in front of a
}
if ($b === 'GOLDEN' || $b === 'GOLDEN') { //Do the same thing with GOLDEN (note, if either variable was "MIMIC" we would have already exited the function at this point
return $a === 'GOLDEN' ? 1:-1;
}
return 0; //Neither of our sort-words were found, don't change the order.
});
var_export($sortMe); //Will be sorted now.
Ответ №2:
Из ручных операторов массива:
Оператор возвращает правый массив, добавленный к левому массиву; для ключей, которые существуют в обоих массивах, будут использоваться элементы из левого массива, а совпадающие элементы из правого массива будут игнорироваться.
Таким образом, вы просто отфильтровываете золотые и имитирующие элементы, а затем формируете объединение отфильтрованных массивов и исходного массива.
<?php
$items =[
'1090' => 'BENNETON',
'6761' => 'BENNETON',
'3963' => 'BENNETON',
'1662' => 'BENNETON',
'1099' => 'BENNETON',
'694' => 'XELOLE',
'2527' => 'XELOLE',
'4553' => 'XELOLE',
'7908' => 'XELOLE',
'4787' => 'XELOLE',
'8261' => 'GOLDEN',
'8259' => 'GOLDEN',
'8265' => 'GOLDEN',
'2599' => 'VICTORYE',
'860' => 'VICTORYE',
'1117' => 'VICTORYE',
'844' => 'VICTORYE',
'2243' => 'MIMIC',
'1035' => 'MIMIC',
'1025' => 'MIMIC',
'561' => 'MIMIC',
'621' => 'MIMIC',
'2404' => 'OPTIMUM',
'2389' => 'OPTIMUM',
'2396' => 'OPTIMUM',
'1965' => 'OPTIMUM',
'2403' => 'OPTIMUM'
];
$goldens = array_filter($items, function($v) { return $v == 'GOLDEN';});
$mimics = array_filter($items, function($v) { return $v == 'MIMIC';});
$result = $goldens $mimics $items;
var_export($result);
Вывод:
array (
8261 => 'GOLDEN',
8259 => 'GOLDEN',
8265 => 'GOLDEN',
2243 => 'MIMIC',
1035 => 'MIMIC',
1025 => 'MIMIC',
561 => 'MIMIC',
621 => 'MIMIC',
1090 => 'BENNETON',
6761 => 'BENNETON',
3963 => 'BENNETON',
1662 => 'BENNETON',
1099 => 'BENNETON',
694 => 'XELOLE',
2527 => 'XELOLE',
4553 => 'XELOLE',
7908 => 'XELOLE',
4787 => 'XELOLE',
2599 => 'VICTORYE',
860 => 'VICTORYE',
1117 => 'VICTORYE',
844 => 'VICTORYE',
2404 => 'OPTIMUM',
2389 => 'OPTIMUM',
2396 => 'OPTIMUM',
1965 => 'OPTIMUM',
2403 => 'OPTIMUM',
)