Самый эффективный способ переупорядочения массива с известным порядком - PullRequest
1 голос
/ 12 сентября 2011

У меня есть массив, который передается мне в случайном порядке.Массив является массивом массивов, и мне дан порядок размещения массива на основе ключа, который существует в каждом подмассиве.

Например, мне дан массив array(array('id' => 1), array('id' => 2)).Мне сказали упорядочить массивы в порядке (2,1) на основе ключа 'id' каждого подмассива.

Какой самый эффективный способ сделать это в PHP?

Ответы [ 4 ]

1 голос
/ 12 сентября 2011

Эффективность во многом зависит от того, что вы будете делать с данными, поэтому очень сложно ответить. Наиболее эффективным способом было бы признать, что массивы PHP - это фактически упорядоченные карты , а создает массив с ключом id с самого начала . Также обратите внимание, что обычные функции сортировки не будут работать, если вам нужно разместить массив в случайном порядке :

<?php

function add ($needle, &$haystack)
{
    $haystack[$needle['id']] = $needle;
}

$map = array();
add (array('id' => 1), $map);
add (array('id' => 10), $map);
add (array('id' => 100), $map);
add (array('id' => 1000), $map);
add (array('id' => 10000), $map);

$order = array(1,10000,10,1000,100);

foreach ($order as $o)
    print_r ($map[$o]);
1 голос
/ 12 сентября 2011

PHP позволяет вам писать свои собственные функции сортировки. Я не могу ручаться за эффективность этого решения, но оно будет работать и поддерживается языком напрямую, поэтому мне это нравится.

Для вашего случая вы бы написали что-то вроде этого:

function custom_sort_by_id($a, $b) {
    // If the two IDs are the same, no sorting should be done
    if ($a['id'] == $b['id']) {
     return 0;
    }

    return ($a['id'] < $b['id']) ? -1 : 1;
}

Затем вы бы вызвали эту функцию следующим образом:

usort($myarray, "custom_sort_by_id");

Итак, если, например, у вас есть следующий начальный массив:

array(3) {
  [0]=>
  array(2) {
    ["id"]=>        int(3)
    ["value"]=>     int(1)
  }
  [1]=>
  array(2) {
    ["id"]=>        int(2)
    ["value"]=>     int(2)
  }
  [2]=>
  array(2) {
    ["id"]=>        int(1)
    ["value"]=>     int(3)
  }
}

Вы получите следующий результат:

array(3) {
  [0]=>
  array(2) {
    ["id"]=>        int(1)
    ["value"]=>     int(3)
  }
  [1]=>
  array(2) {
    ["id"]=>        int(2)
    ["value"]=>     int(2)
  }
  [2]=>
  array(2) {
    ["id"]=>        int(3)
    ["value"]=>     int(1)
  }
}
0 голосов
/ 12 сентября 2011

Я думаю, что самый эффективный (хотя и не слишком эффективный) процессор может сделать это за 2 прохода:

  1. создать ассоциативный массив с соответствующим ключом:

    foreach ($array as $item) $ids[$item['id']] = $item;
    
  2. построить результат в указанном порядке:

    foreach ($order as $id) $result[] = $ids[$id];
    
0 голосов
/ 12 сентября 2011

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

это при условии, что идентификаторы в порядке (от 1 досколько бы их ни было)

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

Есть и другие вещи, такие как размер списка, если он действительно большой, то вы можете использовать что-то вроде быстрой сортировки, хотя для небольших списков что-то вроде пузырьковой или вставной сортировки работает простоштраф.

http://en.wikipedia.org/wiki/Sorting_algorithm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...