2015-02-08 141 views
2

很難如此解釋這裏是一個例子:如何通過一個鍵的值在PHP排序關聯數組的數組

$strings = array(
    array("languageCode" => "ES", "string" => "hola"), 
    array("languageCode" => "EN", "string" => "hello"), 
    array("languageCode" => "IT", "string" => "ciao"), 
    array("languageCode" => "CHS", "string" => "您好"), 
); 

我想串由languageCode值,通過定義的順序進行排序:

function magicStringOrder(array $strings, array $languageCodeOrder){ 
    // .... 
    return $strings; 
} 

$strings = magicStringOrder($strings, array('EN', 'IT')); 

$strings = array(
    array("languageCode" => "EN", "string" => "hello"), 
    array("languageCode" => "IT", "string" => "ciao"), 
    array("languageCode" => "ES", "string" => "hola"), 
    array("languageCode" => "CHS", "string" => "您好"), 
); 

還有magicStringOrder

我現在知道這是一個簡單的問題來解決幾個循環。我需要一個非常快速的功能(它被稱爲很多次,與大陣)

+0

對於在您的語言編碼器中沒有條目的值,您有什麼期望? – 2015-02-08 11:26:26

+0

@MarkBaker如果定義的順序是假定的位置,否則保持其位置 – 2015-02-08 11:34:46

回答

2

另一個想法不PHP排序功能:

// sort by cmp $arr[$magic_key] <-> arr $magic_order 
function magicSort($arr, $magic_key="", $magic_order = array()) 
{ 
    $sorted = array(); 
    foreach($magic_order AS $v) { 
    foreach($arr AS $k2 => $v2) { 
     if($v===$v2[$magic_key]) { 
     $sorted[] = $v2; 
     unset($arr[$k2]); 
     } 
    } 
    } 

    // attach what's left 
    return array_merge($sorted, $arr); 
} 

Test it at eval.in鏈路很快到期)

$strings = array(
    array("languageCode" => "ES", "string" => "hola"), 
    array("languageCode" => "EN", "string" => "hello"), 
    array("languageCode" => "IT", "string" => "ciao"), 
    array("languageCode" => "CHS", "string" => "??"), 
); 

print_r(magicSort($strings, "languageCode", array("EN", "IT"))); 

輸出到

Array 
(
    [0] => Array 
     (
      [languageCode] => EN 
      [string] => hello 
     ) 

    [1] => Array 
     (
      [languageCode] => IT 
      [string] => ciao 
     ) 

    [2] => Array 
     (
      [languageCode] => ES 
      [string] => hola 
     ) 

    [3] => Array 
     (
      [languageCode] => CHS 
      [string] => 您好 
     ) 

) 

$magic_order也可以是空的。如果是這樣,該數組只是重新編制索引。具有值不在$magic_order中的值的數組向下移動,並保持其順序。

不確定,如果這正是你需要的。

+1

是一個好主意! – 2015-02-08 12:44:43

+0

基準測試後這個更快 – 2015-02-08 12:58:56

+0

它工作起來很簡單,很高興你喜歡它@SimoneNigro :) – 2015-02-08 13:00:16

1

如果這不是一個給語言加權的問題,排序變得更容易,因此更快。您可以使用asort根據存儲的權重對數組進行排序。如果一種語言不在$languageCodeOrder中,則它的權重將變爲0並且趨向有序數組的末尾。

數組的最終順序將從高權重到低權重。那就是:如果EN爲1的權重將出現後,它在陣列中有2

$strings = array(
    array("languageCode" => "ES", "string" => "hola"), 
    array("languageCode" => "EN", "string" => "hello"), 
    array("languageCode" => "IT", "string" => "ciao"), 
    array("languageCode" => "CHS", "string" => "您好"), 
); 

function magicStringOrder(array $strings, array $languageCodeOrder) { 
    uasort($strings, function($a,$b) use ($languageCodeOrder) { 
     $val_a = (isset($languageCodeOrder[$a["languageCode"]])) ? $languageCodeOrder[$a["languageCode"]] : 0; 
     $val_b = (isset($languageCodeOrder[$b["languageCode"]])) ? $languageCodeOrder[$b["languageCode"]] : 0; 

     return $val_b - $val_a; 
    }); 
    return $strings; 
} 

$strings_ordered = magicStringOrder($strings, array('EN' => 1, 'IT' => 2, 'ES' => 3, 'CHS' => 4)); 

print_r($strings_ordered); 

如果陣列大,最好還是依靠PHP排序算法,而不是試圖實現自定義的。

隨意修改算法中的任何內容(順序或其他)。

+0

功能幾乎就像我會(看我的編輯)。但是,我寧願語言不在訂單中,保持其位置。如果可能的話,根據新的頭寸(0,1,2)和(1,2,4)重新計算指數會更好。非常感謝 – 2015-02-08 12:09:18

+0

請原諒,刪除我的編輯,這是錯誤的 – 2015-02-08 12:19:27

+0

@SimoneNigro無後顧之憂,很高興它幫助,祝你好運:) – acontell 2015-02-08 12:33:09