2013-10-10 175 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,01來構建邏輯,以確定比較的行應該在之前,之後還是保持不變。

// 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