2016-03-30 2 views
1

Мне нужен один help.i am сортирующий массив с использованием значения ключа, мне нужно, если одно значение ключа будет таким же, а затем оно должно появиться в алфавитном порядке снова. Позвольте мне объяснить мой код ниже.Как отсортировать значение массива с помощью ключа в 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"} 
]} 

здесь, если стоимость заказа будет одинаковым (lets say-order->4), то он должен прийти в алфавитном порядке согласно subcat_name (BRUNCH,CHINESE), как это.

+4

Возможный дубликат [Как отсортировать массив ассоциативных массивов по значению заданного ключа в PHP?] (HTTP: //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

Необходимо создать группы по идентификатору заказа, а затем отсортировать их.

$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() сортировать массив, используя пользовательскую функцию, которые получают два элемента массива в качестве аргументов: возвращаемое значение функции должно быть целым числом меньше, равно или больше нуля, если первый аргумент считается соответственно меньшим, равным или большим, чем второй.

В вашем случае, если ->order ключи равны, мы используем strcmp() вернуть своего рода значение, основанное на ->subcat_name, в противном случае мы возвращаем разницу между двумя ->order значениями.


Смежные вопросы