Альтернатива функции array_shift - PullRequest
2 голосов
/ 29 апреля 2010

Хорошо, мне нужно сохранить ключи в этом массиве, и я просто хочу сместить 1-й элемент из этого массива. На самом деле я знаю, что первый ключ этого массива всегда будет 1, когда я делаю это:

// Sort it by 1st group and 1st layout.
ksort($disabled_sections);
    foreach($disabled_sections as &$grouplayout)
        ksort($grouplayout);

По сути, я бы предпочел не разбирать его, чтобы получить этот массив, где ключ = 1. И, честно говоря, я не большой поклонник array_shift, он просто занимает много времени. Есть ли другой способ. Возможно, способ извлечь весь массив, где находится $ disabled_sections [1], без необходимости выполнять foreach и сортировку, а также array_shift. Я просто хочу добавить $ disabled [1] в другой массив и полностью удалить его из этого массива. При этом ключи обоих массивов структурированы так, как они есть. Технически было бы неплохо сделать это:

$array = array();
$array = $disabled_sections[1];

Но он должен удалить его из $ disabled_sections. Могу ли я использовать что-то вроде этого подхода ...

$array = array();
$array = $disabled_sections[1];
$disabled_sections -= $disabled_sections[1];

Возможно ли что-то подобное вышеописанному?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 29 апреля 2010

Несмотря на то, что есть принятый ответ на это;в случае, если кто-то наткнется на это, способ отменить установку первого элемента массива ( независимо от его ключа или порядка его ключей ) без использования array_shift:

reset($array); // sets internal array pointer to start
unset($array[key($array)]); // key() returns key of current array element

Хотя я довольно убежден, что именно это array_shift делает внутренне (так что я полагаю, что прирост производительности при этом не будет), за исключением дополнительного возврата полученного значения:

$element = reset($array); // also returns element
unset($array[key($array)]);
return $element;

Просто ради завершения.

2 голосов
/ 29 апреля 2010

Хотя в этом случае нет оператора -=, вы можете использовать unset для удаления этого элемента из массива:

unset(disabled_sections[1]);

Но это просто реализация вашей собственной версии shift. Мне интересно, в какой ситуации вы находите array_shift() медленным и как вы тестируете, говорит медлительность.

Числовые массивы по умолчанию сортируются по номерам - ксорт не требуется. Может быть, вы должны попробовать что-то вроде

while($array = array_shift($group_of_arrays)) {

  // ... do stuff
}

Если вас не беспокоит порядок, в котором вы извлекаете элементы из массива, вы можете использовать «array_pop» вместо «array_shift». Поскольку «array_pop» удаляет элементы из конца массива, переиндексация не требуется, а производительность резко возрастает. При тестировании с массивом около 80 000 записей я вижу уменьшение времени обработки на 90% с помощью array_pop.

...