2016-07-14 2 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' 
     ) 
    . 
    . 
    . 

Я мог бы передать другую строку, как 'ЕНТ', и для того, подобным образом. Возможно ли это?

+0

показать, что вы пробовали. –

+0

_ «Если я хочу заказать« BOX », это не очень логично. Вы имеете в виду, что хотите заказать по типу? – FirstOne

+0

Некоторые ссылки: [Как я могу сортировать массивы и данные в PHP?] (Http://stackoverflow.com/questions/17364127/how-can-i-sort-arrays-and-data-in-php) ** && ** [PHP Sort Array by SubArray Value] (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; 
    }); 

это должно поместить любой элемент «BOX» на передней панели массива.

Если все остальные должны быть сгруппированы, а не return 0 do return $a['type'] < $b['type'].

редактировать: интегрированный Камаль Пэла предложение/коррекция

+1

'$ sortvalue' недоступен внутри анонимной функции, вам нужно использовать функцию закрытия ..' ($ a, $ b) use ($ 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); 
}); 
Смежные вопросы