2012-03-18 3 views
1

Итак, у меня есть этот массив.Сортировка массива по значению ключа

Array 
(
    [0] => Array 
     (
      [key_1] => something 
      [type] => first_type 
     ) 

    [1] => Array 
     (
      [key_1] => something_else 
      [type] => first_type 
     ) 

    [2] => Array 
     (
      [key_1] => something_else_3 
      [type] => second_type 
     ) 

    [3] => Array 
     (
      [key_1] => something_else_4 
      [type] => second_type 
     ) 
) 

Я должен сортировать по значению типа в схеме, как это:

first_type 
second_type 
first_type 
second_type 

Мои вопросы, как я могу это сделать?

Большое спасибо!

+0

Думаю, вам придется написать это самостоятельно; тот факт, что '[type]' вложен в собственный массив, означает, что стандартные функции PHP собираются найти это сложнее, хотя вы должны попробовать использовать 'sort()' и друзей, чтобы посмотреть, что они выплюнули. – Bojangles

+1

Прежде всего, вы должны стать более понятным в своем роде. Я даже не вижу, чтобы ты сказал, что есть один. Итак, какова спецификация вашей сортировки? – hakre

+0

Предположим, что у меня есть ключ типа, и значения могут быть 1 или 2. Мне нужно отсортировать его следующим образом: 1 2 1 2 1 2 1 2 ... и т. Д. –

ответ

0

Так вот, как я получил его на работу:

function filter_by_value($array, $index, $value) { 
    if(is_array($array) && count($array) > 0) { 
     foreach(array_keys($array) as $key){ 
      $temp[$key] = $array[$key][$index]; 
      if ($temp[$key] == $value){ 
       $newarray[$key] = $array[$key]; 
      } 
     } 
    } 
    return $newarray; 
} 
$array = /* array here */ 
$type1 = array_values(filter_by_value($array, 'type', '1')); 
$type2 = array_values(filter_by_value($array, 'type', '2')); 
$i = 1; $x = 1; $y = 1; 
$sorted = array(); 
foreach ($array as $a) { 
    if ($i % 2) { 
     $sorted[$i-1] = $type1[$x-1]; 
     $x++; 
    } else { 
     $sorted[$i-1] = $type2[$y-1]; 
     $y++; 
    } 
    $i++; 
} 

Найдено filter_by_value() на php.net, но я не помню, где именно, это не сделано мной. Возможно, это не лучшее решение, но оно работает очень хорошо.

0

Если sort() и его соответствующие альтернативы не работают, вам необходимо будет использовать usort() или uasort() с пользовательской функцией для сортировки этого массива.

6

Вам необходимо использовать usort с пользовательской функцией сравнения, которая сравнивает подтаблицы key_1 каждого элемента (для этого вы можете использовать strcmp). Предполагая, что вы не хотите, чтобы изменить структуру результирующего массива, это будет выглядеть примерно так:

$arr = /* your array */ 
usort($arr, function($a, $b) { return strcmp($a['key_1'], $b['key_1']); }); 
+0

Это отсортировало массив следующим образом: Все first_type тогда все second_type. Но мне нужно, чтобы это выглядело как first_type | second_type | first_type | second_type | и т.д. Спасибо! –

+0

@ Vlad.P: "sort" - это не тот глагол для описания того, что вы хотите сделать ... – Jon

+0

Жаль, может быть, организовать более наглядно? –

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