2016-07-14 170 views
0

我正在尋找一種方法來按特定值關聯數組,我不確定這是否可能。我嘗試了array_multisort()usort()的功能,但我擔心我無法得到它。PHP - 按特定值關聯數組的排序陣列

實施例:

$array[] = array('id' => 74215, 'type' => 'BOX'); 
$array[] = array('id' => 76123, 'type' => 'UNT'); 
$array[] = array('id' => 71231, 'type' => ''); 
$array[] = array('id' => 79765, 'type' => 'UNT'); 
$array[] = array('id' => 77421, 'type' => 'BOX'); 

如果我想通過 'BOX'命令,那麼該陣列將是:

Array (
    [0] => Array 
     (
        [id] => 77421 
        [type] => 'BOX' 
     ) 
    [1] => Array 
     (
        [id] => 74215 
        [type] => 'BOX' 
     ) 
    [2] => Array 
     (
        [id] => 76123 
        [type] => 'UNT' 
     ) 
    . 
    . 
    . 

我能通過其它字符串如 'UNT',和爲了像那樣。 這可能嗎?

+0

顯示你已經嘗試過。 –

+0

_「如果我想按'BOX'排序,」_這不是很合乎邏輯。你的意思是你想用'type'命令嗎? – FirstOne

+0

一些參考文獻:[我如何在PHP中對數組和數據進行排序?](http://stackoverflow.com/questions/17364127/how-can-i-sort-arrays-and-data-in-php)** && ** [PHP排序數組的子值](http://stackoverflow.com/questions/2477496/php-sort-array-by-subarray-value) – FirstOne

回答

1

我假設你想通過字符串匹配進行「排序」,首先匹配那個字符串的所有人,然後是所有那些不匹配的人。除非你有一個古老的PHP版本,這可能是工作:

$sortvalue = 'BOX'; 
usort($array, function($a, $b) use ($sortvalue) { 
     if($a['type'] == $sortvalue) return -1; 
     elseif($b['type'] == $sortvalue) return 1; 
     else return 0; 
    }); 

本應該把任何「盒子」進入你的陣列前端。

如果所有其他人都應該分組,而不是return 0return $a['type'] < $b['type']

編輯:綜合卡邁勒朋友的建議/校正

+1

'$ sortvalue'在匿名函數中不可訪問,您需要使用閉包..'function($ a,$ b )使用($ sortvalue)...'..也見http://stackoverflow.com/questions/18616214/confusion-with-php-closures –

+0

這完美的作品!!!非常感謝你@Jakumi – bey23

+0

@ kamal-pal:將調整我的答案。謝謝。 – Jakumi

0

我不知道如果PHP有它自己的函數,這樣做,但我寫我自己,希望它有助於:

function sortArray($array_x, $key) 
{ 
    $added_indexes; 
    $new_array; 

    for($i=0;$i<count($array_x);$i++) 
    { 
     if($array_x[$i]['type']==$key){ 
      $new_array[]=$array_x[$i]; 
      $added_indexes[]=$i; 
     } 
    } 

    for($i=0;$i<count($array_x);$i++) 
    { 
     if(!in_array($i,$added_indexes)) 
     { 
      $new_array[]=$array_x[$i]; 
     } 
    } 

    return $new_array; 
} 

所以當你這樣做:

$array[] = array('id' => 74215, 'type' => 'BOX'); 
$array[] = array('id' => 76123, 'type' => 'UNT'); 
$array[] = array('id' => 71231, 'type' => ''); 
$array[] = array('id' => 79765, 'type' => 'UNT'); 
$array[] = array('id' => 77421, 'type' => 'BOX'); 

print_r(sortArray($array,"BOX")); 

給出了這樣的:

Array 
(
    [0] => Array 
     (
      [id] => 74215 
      [type] => BOX 
     ) 

    [1] => Array 
     (
      [id] => 77421 
      [type] => BOX 
     ) 

    [2] => Array 
     (
      [id] => 76123 
      [type] => UNT 
     ) 

    [3] => Array 
     (
      [id] => 71231 
      [type] => 
     ) 

    [4] => Array 
     (
      [id] => 79765 
      [type] => UNT 
     ) 
) 
0

是的,我在想一個類似的解決方案:

usort($array, function ($a, $b) { 
    return $a['type'] == 'BOX' ? -1 : ($b['type'] == 'BOX' ? 1 : 0); 
});