Пользовательский порядок элементов по значению в массиве

#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',
)