2013-02-27 143 views
1

如何通過type來訂購以下數組,其中url最先出現,然後doc然後page對多維數組進行排序並保留同級

$array = array(
    0 => array(
     'id' => '14', 
     'position' => '0', 
     'type' => 'related-url' 
    ), 
    1 => array(
     'id' => '2367', 
     'position' => '0', 
     'type' => 'related-doc' 
    ), 
    2 => array(
     'id' => '99', 
     'position' => '0', 
     'type' => 'related-page' 
    ), 
    4 => array(
     'id' => '180', 
     'position' => '2', 
     'type' => 'related-doc' 
    ), 
    5 => array(
     'id' => '10', 
     'position' => '3', 
     'type' => 'related-doc' 
    ) 
); 

其結果將是

$array = array(
    0 => array(
     'id' => '14', 
     'position' => '0', 
     'type' => 'related-url' 
    ), 
    1 => array(
     'id' => '2367', 
     'position' => '0', 
     'type' => 'related-doc' 
    ), 
    4 => array(
     'id' => '180', 
     'position' => '2', 
     'type' => 'related-doc' 
    ), 
    5 => array(
     'id' => '10', 
     'position' => '3', 
     'type' => 'related-doc' 
    ), 
    2 => array(
     'id' => '99', 
     'position' => '0', 
     'type' => 'related-page' 
    ) 
); 

維護鍵關聯並不重要。

回答

1
function cmp($a, $b) { 

    $sortOrder = array(
     "related-url" => 1, 
     "related-doc" => 2, 
     "related-page" => 3 
    ); 

    return $sortOrder[$a['type']] - $sortOrder[$b['type']]; 
} 

usort($array, "cmp"); 
+0

+1最清潔和最可讀的解決方案至今 – 2013-02-27 17:39:58

1

好了,這是醜陋的,但它的工作原理)

$doc = array(); 
$url = array(); 
$page = array(); 

foreach($array as $v) 
    switch($v['type']){ 
     case 'related-url': $url[] = $v;break; 
     case 'related-doc': $doc[] = $v;break; 
     case 'related-page': $page[] = $v;break; 
    } 

$array = array_merge($url, $doc, $page); 
0

此使用usort,繼承人一個簡單的例子。我很確定這個邏輯有效,但毫無疑問,這是一個更好的方法。

usort($your_array, function ($elem1, $elem2) { 
    if($elem1['type'] == 'related-url') 
    return true; 

    elseif($elem2['type'] == 'related-url') 
    return false; 

    elseif($elem1['type'] == 'related-doc') 
    return true; 

    else 
    return false; 
}); 

如果element1是一個url,它總是返回true,如果它是isnt和element2是一個url,它總是false。如果這兩個語句都不是true,並且element1是doc,則返回true,因爲element2是doc或page。最後,如果element1是一個頁面,則總是返回false,因爲element2是文檔或頁面。

0

這應該工作

$urls = $docs = $pages = array(); 
foreach ($array as $sub) { 
    switch($sub['type']) { 
     case 'related-url': 
      $urls[] = $sub; 
     break; 
     case 'related-doc': 
      $docs[] = $sub; 
     break; 
     case 'related-page': 
      $pages[] = $sub; 
     break; 
    } 
} 
$result = array_merge($urls, $docs, $pages); 
echo '<pre>', var_dump($result), '</pre>'; 
1

你去那裏

function cmp($a, $b) { 

    $v1 = $a['type']; 
    $v2 = $b['type']; 
    $v1 = str_replace("related-", "", $v1); 
    $v2 = str_replace("related-", "", $v2); 
    $firstChar = abs(ord(substr($v1,0,1)) - ord("u")); 
    $firstChar2 = abs(ord(substr($v2,0,1)) - ord("u")); 

    return $firstChar<=$firstChar2?-1:1; 

} 

usort ($array, "cmp");