2016-03-30 24 views
1

Bir anahtarın değerini kullanarak bir help.i am sıralama dizisine ihtiyacım var, bir anahtar değerinin aynı olacağını sonra tekrar alfabetik sırayla gelmesi gerekiyor. Kodumu açıklamama izin ver altında.PHP'de anahtar kullanarak değer dizisi nasıl ayarlanır

{"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"} 
]} 

sipariş değeri (lets say-order->4) aynı, o zaman gelmelidir olacak burada eğer alfabetik böyle subcat_name (BRUNCH,CHINESE) uyarınca.

+4

Tekrarlama olabilir: //stackoverflow.com/questions/1597736/how-to-sort-an-array-of-associative-arrays-by-value-of-a-given-key-in-php) –

+0

Hayır, eğer dizi sırası değeri aynı, alfabetik altcat_adı kontrol etmeli ve sıralamalıdır. – subhra

+1

Birden çok sıralamak için multisort() işaretleyin. –

cevap

0

Sipariş kimliği ile gruplar oluşturmalı ve bunları sıralamanız gerekir.

$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

Bu işe yarayabilir: Sen usort() kullanabilirsiniz

$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

. Verilerinizi varsayarsak $obj nesne saklanır: fonksiyonu yukarıda

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

sıralama $obj->data isteğinize göre.

eval.in demo

usort() sıralama bağımsız değişken olarak dizinin iki elemanı alma özel bir işlev kullanılarak bir dizi: geri fonksiyon değeri eşit veya sıfırdan büyük ise daha az bir tam sayı olmalıdır Birinci argümanın sırasıyla saniyeden küçük, eşit veya daha büyük olduğu kabul edilir. Senin durumunda

, ->order eğer tuşları aksi takdirde biz iki ->order değerler arasındaki farkı iade sort'u ->subcat_name dayalı değeri döndürmek için strcmp() kullanın eşitiz.


[Nasıl PHP verilen bir anahtar değeri ile ilişkisel diziler içeren bir dizi sıralamak için?] (Http
İlgili konular