2013-10-10 3 views
0

У меня есть этот массив:Сортировка многомерного массива на основе порядка простого массива

$routes = array(
    array(
    'code' => 'PZSA', 
    'name' => 'PLaza san antonio', 
), 
    array(
    'code' => 'AVAD', 
    'name' => 'Av de asturias', 
), 
    array(
    'code' => 'AVAR', 
    'name' => 'Av simon nieto', 
) 
); 

И я хочу, чтобы отсортировать его на основе следующих клавиш:

$target = array('AVAD', 'AVAR', 'PZSA'); 

Так отсортированный массив будет :

Array 
(
[0] => Array 
    (
     [code] => AVAD 
     [name] => Av de asturias 
    ) 

[1] => Array 
    (
     [code] => AVAR 
     [name] => Av simon nieto 
    ) 

[2] => Array 
    (
     [code] => PZSA 
     [name] => PLaza san antonio 
    ) 

) 

Я пробовал это, и он работает, но я думаю, что это слишком много кода для этой простой вещи. Любые альтернативы? Благодарю.

function _sort($array, $orderArray) { 
     $ordered = array(); 
     foreach ($orderArray as $key) { 
     $ordered[] = find($key, $array); 
     } 
     return $ordered; 
    } 

    function find($code, $routes) { 
     foreach ($routes as $key => $value) { 
     if ($routes[$key]['code'] == $code) { 
      return $routes[$key]; 
     } 
     } 
    } 

$sorted = _sort($routes, $target); 
+1

есть несколько вещей, которые вы могли бы свести к минимуму, например,'$ routes [$ key] ['code']' может стать '$ value ['code']', но для поиска по многомерному массиву обычно требуется специальная функция (или две), подобная этому –

+0

Можете ли вы использовать код в качестве ключа для массива? Затем вы можете просто найти значения по ключу. –

ответ

2

Вместо того, чтобы делать то, что, по существу, линейный поиск для каждого элемента, это может быть быстрым, чтобы повторно индексировать ваш исходный массив по коду:

// create the index 
$indexed = array(); 
foreach($routes as $route) { 
    $indexed[$route['code']] = $route; 
} 

// add each target to a new sorted array in order 
$sorted = array(); 
foreach($target as $code) { 
    $sorted[] = $indexed[$code]; 
} 
1

Вот что array_multisort если для:

foreach ($routes as $key => $row) { 
    $code[$key] = $row['code']; 
    $name[$key] = $row['name']; 
} 
array_multisort($code, SORT_ASC, $name, SORT_ASC, $routes); 

print_r($routes); 

Таким образом, вы даже не нужен второй массив!

На самом деле в вашем случае вам нужно только, чтобы отсортировать коды так что это будет делать трюк:

foreach ($routes as $key => $row) { 
    $code[$key] = $row['code']; 
} 

array_multisort($code, SORT_ASC, $routes); 
+2

'Таким образом, вам даже не нужен второй массив!'. Ага. Вам нужны дополнительные два массива :-) – Peter

+0

Конечно;) Я имел в виду, что вам не нужно извлекать значения кода, тот же цикл позаботится об этом. –

2

Чуть более общее решение, в котором вы можете просто установить ключ, который вы хотите сортировать и он должен работать для любого многомерного массива.

//key to sort by 
$sortBy = 'code'; 

$sorted = array(); 
foreach($routes as $route) { 
    foreach($route as $key => $value) { 
    if(!isset($sorted[$key])) { 
     $sorted[$key] = array(); 
    } 
    $sorted[$key][] = $value; 
    } 
} 

array_multisort($sorted[$sortBy], SORT_ASC, $routes); 
print_r($routes) 
1

В качестве альтернативы ответы уже упоминалось (за исключением Петра), вы можете использовать логику uasort(). Сначала вам нужно будет определить функцию сравнения (сравнить $ a до $ b) и построить логику, используя значения -1, 0 и 1, чтобы решить, должна ли сравниваемая строка идти до, после или оставаться неизменной.

// This sorts simply by alphabetic order 
function reindex($a, $b) 
{ 
    // Here we grab the values of the 'code' keys from within the array. 
    $val1 = $a['code']; 
    $val2 = $b['code']; 

    // Compare string alphabetically 
    if($val1 > $val2) { 
     return 1; 
    } elseif($val1 < $val2) { 
     return -1; 
    } else { 
     return 0; 
    } 
} 

// Call it like this: 
uasort($routes, 'reindex'); 

print_r($routes); 

Конечно, это работает только как маленький пример, и если вы пытаетесь индексировать их в алфавитном порядке. Если вам нужно сортировать по точному набору ключей, а не в алфавитном порядке, это может быть немного сложнее, поскольку оно не принимает никаких других параметров.

PHP uasort() Reference

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