2015-08-13 3 views
1

все! Может кто-нибудь помочь мне с этой проблемой? У меня есть массив около 15,000 элементов, созданных случайным образом со следующей структурой:PHP Сортировка/Баланс многомерный массив

<?php 
$array = array(
    array(
     "id" => 134, 
     "vertical_id" => 1 
    ), 
    array(
     "id" => 52, 
     "vertical_id" => 3 
    ), 
    array(
     "id" => 334, 
     "vertical_id" => 2 
    ), 
    array(
     "id" => 123, 
     "vertical_id" => 2 
    ), 
    array(
     "id" => 153, 
     "vertical_id" => 1 
    ), 
    array(
     "id" => 176, 
     "vertical_id" => 3 
    ), 
    ... 
); 

_

Я хочу, чтобы отсортировать массив, так что конечный результат что-то вроде этого:

<?php 
$array = array(
    array(
     "id" => 134, 
     "vertical_id" => 1 
    ), 
    array(
     "id" => 334, 
     "vertical_id" => 2 
    ), 
    array(
     "id" => 52, 
     "vertical_id" => 3 
    ), 
    array(
     "id" => 153, 
     "vertical_id" => 1 
    ), 
    array(
     "id" => 123, 
     "vertical_id" => 2 
    ), 
    array(
     "id" => 176, 
     "vertical_id" => 3 
    ), 
    ... 
); 

_

Так что если я делаю array_slice, я «гарантирую», что у меня одинаковое количество элементов для каждой вертикали.

Любые предложения?

_

+1

где ваш код? – aldrin27

+1

Имеет ли смысл 'id'? Или просто нужно, чтобы 'vertical_id' отсортировался как 1,2,3,1,2,3 ...? –

+0

@ Don'tPanic порядок идентификаторов не имеет значения, я просто хочу, чтобы меня сортировали как 1, 2, 3, 1, 2, 3 и т. Д. – marcosmartinez

ответ

0

Прежде всего, ваш вопрос не ясно, как вы хотите, чтобы быть отсортированы по идентификатору тоже делает заказ вопросов ид?

Для того, чтобы дать вам представление, вам нужно написать свою собственную функцию сортировки my_cmp() на основе некоторой логики (которая всегда имеет значение в порядке возрастания или убывания) и передать эту функцию my_cmp() в usort.

Например,

function my_cmp($a, $b) 
    { 
     // I'm sorting based on id field in ascending order 
     return $a['id'] - $b['id']; 
    } 

usort($array1, "my_cmp"); 

Для вашего данного массива, приведенный выше код будет производить

Array 
(
    [0] => Array 
     (
      [id] => 52 
      [vertical_id] => 3 
     ) 

    [1] => Array 
     (
      [id] => 123 
      [vertical_id] => 2 
     ) 

    [2] => Array 
     (
      [id] => 134 
      [vertical_id] => 1 
     ) 

    [3] => Array 
     (
      [id] => 153 
      [vertical_id] => 1 
     ) 

    [4] => Array 
     (
      [id] => 176 
      [vertical_id] => 3 
     ) 

    [5] => Array 
     (
      [id] => 334 
      [vertical_id] => 2 
     ) 

) 

Просто используйте этот пример и отсортировать массив в какой бы путь вы хотите. приветствия!

+0

порядок идентификаторов не имеет значения, я просто хочу сортироваться по вертикали_id как 1, 2, 3, 1, 2, 3 .. и т. д. – marcosmartinez

0

Во-первых, вы можете преобразовать массив в многомерный массив с группами элементов, имеющих одинаковые vertical_id.

foreach ($array as $item) { 
    $groups[$item['vertical_id']][] = $item; 
} 

Затем сортировать группы по ключевым словам. Поскольку мы использовали vertical_id в качестве ключа внешнего массива, это гарантирует, что группы находятся в правильном порядке.

ksort($groups); 

Затем вы можете цикл по группам неоднократно, не появляются пункты от них до тех пор, один из них становится пустым, добавляя свои элементы в новый массив.

while (true) { 
    // with each iteration of the foreach loop, you will get an item with vertical_id=1, 
    // vertical_id=2, and vertical_id=3 (in that order, because of the ksort.) 
    foreach ($groups as &$group) { 
     // using a reference to $group because otherwise foreach will just make a copy 
     if (!$group) break 2; // the 2 means it breaks out of the while loop 
     $sorted_array[] = array_pop($group); // add the item to the sorted array 
    } 
} 

Если вы не имеют равное количество элементов для каждого vertical_id, это не будет использовать все элементы; он будет продолжать идти до тех пор, пока не закончится количество предметов за один vertical_id.

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