2014-01-14 3 views
-2

у меня есть этот массивкак отсортировать массив на основе другого массива в php?

array(
    'pc' => array('count'=>3), 
    'xbox' => array('count'=>3), 
    'wii' => array('count'=>3), 
    '3ds' => array('count'=>3), 
    'other' => array('count'=>3), 
) 

и я хочу заказать его как

array(
    'wii' => array('count'=>3), 
    'xbox' => array('count'=>3), 
    'other' => array('count'=>3), 
    '3ds' => array('count'=>3), 
    'pc' => array('count'=>3), 
) 

им думать, что мне нужно, чтобы иметь еще один массив для сортировки его ??

ключи не могут быть одинаковы, так что я думаю, что isset() в порядке в одной точке

редактировать: критерий является вторыми ключами массива

каких-либо идеи?

+2

Каковы критерии для сортировки? Я его не вижу. –

+1

Кажется вполне случайным для меня @JohnConde – qwertynl

+0

edit: критерии - это второй ключ массива – Patrioticcow

ответ

0

Вам нужно будет определить собственный алгоритм сортировки. Вы можете сделать это, используя функцию PHP uksort(). (. Разница в очень похожий usort() функции в том, что он сравнивает ключи в буях вместо его значения)

Это может выглядеть примерно так (требуется PHP> = 5.3 из-за анонимные функции, которые я использую в ней):

<?php 
$input = array(
    'pc' => array('count'=>3), 
    'xbox' => array('count'=>3), 
    'wii' => array('count'=>3), 
    '3ds' => array('count'=>3), 
    'other' => array('count'=>3), 
); 
$keyOrder = array('wii', 'xbox', 'other', '3ds', 'pc'); 

uksort($input, function($a, $b) use ($keyOrder) { 
    // Because of the "use" construct, $keyOrder will be available within 
    // this function. 
    // $a and $b will be two keys that have to be compared against each other. 

    // First, get the positions of both keys in the $keyOrder array. 
    $positionA = array_search($a, $keyOrder); 
    $positionB = array_search($b, $keyOrder); 

    // array_search() returns false if the key has not been found. As a 
    // fallback value, we will use count($keyOrder) -- so missing keys will 
    // always rank last. Set them to 0 if you want those to be first. 
    if ($positionA === false) { 
     $positionA = count($keyOrder); 
    } 
    if ($positionB === false) { 
     $positionB = count($keyOrder); 
    } 

    // To quote the PHP docs: 
    // "The comparison function must return an integer less than, equal to, or 
    // greater than zero if the first argument is considered to be 
    // respectively less than, equal to, or greater than the second." 
    return $positionA - $positionB; 
}); 

print_r($input); 
+0

, похоже, работает для моих нужд. благодаря – Patrioticcow

Смежные вопросы