2015-04-07 67 views
2

我是新來的PHP,並試圖用特定順序數組排序字符串的二維數組。一直在尋找使用'usort'和'比較',但是當使用2d數組和字符串時似乎無法將我的頭圍繞在它們周圍。按特定順序排列的PHP排序2d字符串數組

需要將數組輸入到方法並返回具有相同格式的排序數組。因此,對於數組中的每個條目,它將根據順序數組的順序對第二級「文件」值進行排序。任何建議如何做到這一點?

//actual array to be sorted by 'file' 
$Array ( 
[0] => Array ([source] => img/table/icon/toxic.svg [file] => toxic) 
[1] => Array ([source] => img/table/icon/health.svg [file] => health) 
[2] => Array ([source] => img/table/icon/irritant.svg [file] => irritant )); 

//order array with desired sort order 
$order = array("irritant","corrosive","environment" ,"health","toxic","oxidizing","flammable","explosive","gas"); 

//Desired Output Result 
$Array ( 
[0] => Array ([source] => img/table/icon/irritant.svg [file] => irritant) 
[1] => Array ([source] => img/table/icon/health.svg [file] => health) 
[2] => Array ([source] => img/table/icon/toxic.svg [file] => toxic)); 

看到這麼刺激的第一和毒性是最後:)

回答

0

的基本方法是通過陣列和陣列順序既迭代並重新分配鍵進入一個新的數組...

<?php 
    $a[] = array('source' => 'img/table/icon/toxic.svg','file'=>'toxic'); 
    $a[] = array('source' => 'img/table/icon/health.svg','file'=>'health'); 
    $a[] = array('source' => 'img/table/icon/irritant.svg','file'=>'irritant'); 

    $b = array(); 

    $order = array("irritant","corrosive","environment","health","toxic","oxidizing","flammable","explosive","gas"); 

    foreach ($a as $arr) { 
     foreach ($order as $key => $o) { 
      if ($o == $arr['file']) { 
       $b[$key] = $arr; 
       break; 
      } 
     } 
    } 
    ksort($b); 
    print_r(array_values($b)); // or print_r($b); if you dont want sequential keys 
?> 

輸出:

Array ( 
[0] => Array ([source] => img/table/icon/irritant.svg [file] => irritant) 
[1] => Array ([source] => img/table/icon/health.svg [file] => health) 
[2] => Array ([source] => img/table/icon/toxic.svg [file] => toxic) 
) 
+0

謝謝你的工作....看起來很簡單,但wudve帶了我一陣子,想弄清楚使用arrayflip和ksort。 – Orbitall

+0

你甚至不需要'array_flip' ......看看我最後的編輯。沒有這個可以做到。也很高興我能幫上忙。 xathien提出的usort方法也可以工作,但對於PHP的新手來說,它沒有解釋任何東西。 – zgr024

1

這可以通過巧妙地利用了PHP的來完成函數。你的電話可能看起來像這樣:

$order = array("irritant","corrosive","environment" ,"health","toxic","oxidizing","flammable","explosive","gas"); 
usort($array, function ($a, $b) use ($order) { 
    $aOrder = array_search($a['file'], $order); 
    $bOrder = array_search($b['file'], $order); 
    if ($aOrder == $bOrder) return 0; 
    return ($aOrder > $bOrder) ? 1 : -1; 
}); 
+0

這樣更有效率的使用?只是試了一下,打印結果時得到一個空數組... probs理由我ñ我理解壽。 – Orbitall

+0

這將是可測量的大型陣列比原始PHP這樣做更有效,因爲'usort()'做它無論是在就地和使用C,使之更內存和時間效率。 – xathien