2011-10-18 74 views
6

我想排序由另一個數組的多維數組,但迄今爲止已經短暫。
array_multisort似乎只適用於真正的排序。PHP的 - 由另一個陣列排序多維數組

假設我有這2個數組:

$order = array(2,3,1); 

$data = array(
    array('id' => 1, 'title' => 'whatever'), 
    array('id' => 2, 'title' => 'whatever'), 
    array('id' => 3, 'title' => 'whatever') 
); 

現在我想根據我的$order排列順序進行排序我$data陣列。
這是我想的結果是:

$data = array(
    array('id' => 2, 'title' => 'whatever'), 
    array('id' => 3, 'title' => 'whatever') 
    array('id' => 1, 'title' => 'whatever'), 
); 

我可以通過運行一個嵌套循環做到這一點很容易,但不會很好地擴展(我的數組是相當大的,而陣列有更多的領域)。

回答

4

在PHP中沒有內置函數,我無法想到任何自定義函數,這將使用usort來做到這一點。但是array_map很簡單,所以爲什麼不使用它呢?

$sorted = array_map(function($v) use ($data) { 
    return $data[$v - 1]; 
}, $order); 
+0

即時通訊不能夠使用我當前版本的PHP匿名函數 - 這將如何工作,而不使用它們? –

+0

在這裏打開了一個問題http://stackoverflow.com/questions/13589707/php-modify-code-to-avoid-anonymous-functions –

0

您可以嘗試使用自定義排序usort()。這樣你可以使用第一個數組來確定第二個數組的順序。

+0

我曾看過usort,但不知道它是否/如何與多維數組一起工作。 – MegaHit

+0

這就是使它非常有用的原因。您可以定義一個可以訪問整個項目的函數,無論它只是一個字符串還是一個多維數組。所以在比較函數中,您可以比較順序數組中的每個值索引。所以像這樣:return(array_search($ a ['id'],$ order)> array_search($ b ['id'],$ order))? -1:1; –

4

在你的例子中,$ data數組中的ids被連續編號並從1開始。下面給出的代碼假設情況總是如此。如果情況並非如此,則代碼不起作用。

$result = array(); 
$index = 0; 
foreach ($order as $position) { 
    $result[$index] = $data[$position - 1]; 
    $index++; 
} 

http://codepad.org/YC8w0yHh您可以看到它適用於您的示例數據。

編輯

如果上述假設不成立,下面的代碼將得到相同的結果:

<?php 

$data = array(
    array('id' => 1, 'title' => 'whatever'), 
    array('id' => 2, 'title' => 'whatever'), 
    array('id' => 3, 'title' => 'whatever') 
); 

$order = array(2,3,1); 
$order = array_flip($order); 

function cmp($a, $b) 
{ 
    global $order; 

    $posA = $order[$a['id']]; 
    $posB = $order[$b['id']]; 

    if ($posA == $posB) { 
     return 0; 
    } 
    return ($posA < $posB) ? -1 : 1; 
} 

usort($data, 'cmp'); 

var_dump($data); 

http://codepad.org/Q7EcTSfs的證明。

通過調用$ order數組上的array_flip(),它可以用於位置查找。這就像一個散列表查找,它在時間上是線性的,或者是O(n)。你不能做得更好。

+0

你最後的解決方案基本上是運行一個糖加嵌套循環。我認爲這不會很好。 – MegaHit

+0

@MegaHit在我的答案中看到更新的代碼,你不能做得比這更好。 –

0

這將是我將如何做。我會使用一個自定義的usort函數(arr_sort)和$ data數組。

<?php 
$order = array(2,3,1); 
$data = array(
    array('id' => 1, 'title' => 'whatever'), 
    array('id' => 2, 'title' => 'whatever'), 
    array('id' => 3, 'title' => 'whatever') 
); 
function arr_sort($a,$b){ 
    global $order; 
    foreach ($order as $key => $value) { 
    if ($value==$a['id']) { 
     return 0; 
     break; 
    } 
    if ($value==$b['id']) { 
     return 1; 
     break; 
    } 
    } 
} 
usort($data,'arr_sort'); 
echo "<pre>"; 
print_r($data); 
echo "<pre>";