2016-03-30 12 views
1

私はキーの値を使用して配列を並べ替えるhelp.iが必要です。もし一つのキーの値がアルファベット順に来るならば必要です。以下。ここPHPのキーを使用して配列の値をソートする方法

{"data":[ 
    {"subcat_id":"9","subcat_name":"SUSHI","order":"9"}, 
    {"subcat_id":"20","subcat_name":"APPETIZERS","order":"6"}, 
    {"subcat_id":"6","subcat_name":"CHINESE","order":"4"}, 
    {"subcat_id":"26","subcat_name":"BRUNCH","order":"4"}, 
    {"subcat_id":"17","subcat_name":"ENTREES","order":"3"}, 
    {"subcat_id":"25","subcat_name":"HAPPY HOUR","order":"2"} 
]} 

順序値は、それは、このような(BRUNCH,CHINESEsubcat_nameごとにアルファベット順(lets say-order->4)と同じに来る必要があります場合。

+4

の可能性のある重複(HTTP [PHP内の指定されたキーの値によって連想配列の配列をソートするには?]: //stackoverflow.com/questions/1597736/how-to-sort-an-array-of-associative-arrays-by-value-of-a-given-key-in-php) –

+0

いいえ、そのような配列の順序の値はアルファベットのsubcat_nameをチェックしてソートする必要があります。 – subhra

+1

multisort()をチェックして複数のソートを行います。 –

答えて

0

注文IDでグループを作成し、並べ替える必要があります。

$json = '{"data":[ 
    {"subcat_id":"9","subcat_name":"SUSHI","order":"9"}, 
    {"subcat_id":"20","subcat_name":"APPETIZERS","order":"6"}, 
    {"subcat_id":"6","subcat_name":"CHINESE","order":"4"}, 
    {"subcat_id":"26","subcat_name":"BRUNCH","order":"4"}, 
    {"subcat_id":"17","subcat_name":"ENTREES","order":"3"}, 
    {"subcat_id":"25","subcat_name":"HAPPY HOUR","order":"2"} 
]}'; 

$data = json_decode($json); 

$ordersGroups = array(); 
foreach ($data->data as $orderData) { 
    if (!isset($ordersGroups[$orderData->order])) { 
     $ordersGroups[$orderData->order] = array($orderData); 
    } else { 
     $ordersGroups[$orderData->order][] = $orderData; 
    } 
} 

$ordersGroups = array_map(function ($orders) { 
    usort($orders, function ($a, $b) { 
     return strcmp($a->subcat_name, $b->subcat_name); 
    }); 
    return $orders; 
}, $ordersGroups); 

$data->data = array_reduce($ordersGroups, function ($carry, $orderGroup) { 
    return array_merge($carry, $orderGroup); 
}, array()); 

$json = json_encode($data); 
0

これは動作可能性があります

$array = //decode your JSON as an array here 

$innerComparison = function ($v1, $v2) { 
     return strcmp($v1["subcat_name"],$v2["subcat_name"]); 
}; 

$mainComparison = function ($v1, $v2) use ($innerComparison) { 
     if ($v1["order"] === $v2["order"]) { 
      return $innerComparison($v1,$v2); 
     } else { 
      return $v1["order"] < $v2["order"]:-1:1; 
     } 

}; 

usort($array["data"], $mainComparison); 
0

あなたはusort()を使用することができます。あなたのデータは$objオブジェクトに格納されていると仮定:

usort 
(
    $obj->data, 
    function($a, $b) 
    { 
     if($a->order == $b->order) return strcmp($a->subcat_name, $b->subcat_name); 
     return $a->order - $b->order; 
    } 
); 

機能の上に並べ替え$obj->dataあなたの要求に応じて。

eval.in demo

usort()ソート引数として配列の2つの要素を受け取るカスタム関数を使用して配列:返された関数の値は整数に等しい、より小さい、または場合は、ゼロより大きくなければなりません。第1引数はそれぞれ第2引数よりも小さい、等しい、または大きいとみなされます。 ->orderキーが対等であれば、あなたの場合は

は、我々はそうでない場合は、我々は2つの->order値の差を返し、->subcat_nameに基づいてソート値を返すためにstrcmp()を使用しています。


関連する問題