2017-03-29 49 views
1

好的,我確信這已經在某個地方得到了回答,我對發佈這樣一個基本問題表示歉意,但我似乎無法在任何地方找到答案...我'米纔剛剛浸漬我的大腳趾到PHP首次和花了我大部分在Javascript的時間,所以對我很好:-)按定義的值列表排序對象數組

我有對象的數組是結構:

[ 
    { 
    title: 'one', 
    type: 'cat' 
    }, 
    { 
    title: 'two', 
    type: 'dog' 
    }, 
    { 
    title: 'three', 
    type: 'snake' 
    }, 
    { 
    title: 'four', 
    type: 'dog' 
    } 
] 

我想要訂購他們的訂單['dog', 'snake', 'cat]所以我得到:

[ 
    { 
    title: 'two', 
    type: 'dog' 
    } 
    { 
    title: 'four', 
    type: 'dog' 
    }, 
    { 
    title: 'three', 
    type: 'snake' 
    }, 
    { 
    title: 'one', 
    type: 'cat' 
    } 
] 

我該怎麼做?

回答

0

PHP code demo

<?php 
ini_set("display_errors", 1); 
$json ='[ 
    { 
    "title": "one", 
    "type": "cat" 
    }, 
    { 
    "title": "two", 
    "type": "dog" 
    }, 
    { 
    "title": "three", 
    "type": "snake" 
    }, 
    { 
    "title": "four", 
    "type": "dog" 
    } 
]'; 
$dataArray=json_decode($json,true); 
$sortFormat=['dog', 'snake', 'cat']; 
$result=array(); 
while(count($dataArray)>0) 
{ 
    foreach($sortFormat as $object) 
    { 
     foreach($dataArray as $key => $objectData) 
     { 
      if($objectData["type"]==$object) 
      { 
       $result[]=$objectData; 
       unset($dataArray[$key]); 
      } 
     } 
    } 
} 
print_r($result); 

輸出:

Array 
(
    [0] => Array 
     (
      [title] => two 
      [type] => dog 
     ) 

    [1] => Array 
     (
      [title] => four 
      [type] => dog 
     ) 

    [2] => Array 
     (
      [title] => three 
      [type] => snake 
     ) 

    [3] => Array 
     (
      [title] => one 
      [type] => cat 
     ) 

) 
0
$order = array_flip(['dog', 'snake', 'cat']); 

usort($data, function($a, $b) use($order) { 
    $aType = $a->type; 
    $bType = $b->type; 

    if (!isset($order[$aType]) && !isset($order[$bType])) {    
     return strcmp($aType, $bType); 
    } 
    $aOrder = $order[$aType] ?? 0; 
    $bOrder = $order[$bType] ?? 0; 

    return $aOrder - $bOrder; 
}); 

編輯:如果你肯定知道 '類型' 只能是的['dog', 'snake', 'cat'],你可以把它簡化之一:

usort($data, function($a, $b) use($order) { 
    return $order[$a->type] - $order[$b->type]; 
}); 
+0

注意''''自PHP7起可用 – Sysix