Ключ Foreach - можно искать вперед без "if (key <wheretoseek) {continue;}"? - PullRequest
0 голосов
/ 09 марта 2012

Представьте себе простой, но большой массив с ключами от 0 до 100000.

При выполнении цикла foreach этого массива можно «искать» вперед без , выполняя что-то вроде:

foreach($array as $key=>$value){
    if($key<10000){
         continue;
    }
}

Мы делаем такую ​​операцию время от времени через нашу кодовую базу.Это похоже на пустую тика, чтобы пройти через каждый из ключей, пока ключ не станет больше, чем 10000.

Возможно ли это в php 5.4?

Спасибо.

Ответы [ 4 ]

5 голосов
/ 09 марта 2012

это было возможно даже в PHP 2.0FI или ALTAIR BASIC

for($i=10000;$i < count($array);$i++){
}

Без сомнения, некоторые придурки скажут, что выполнение count($array) 90000 раз - это тоже пустая трата тиков.Однако, чтобы получить реальное увеличение производительности , нужно вообще избегать длинных циклов.

3 голосов
/ 09 марта 2012
$rest = array_slice($array, 10000);

В зависимости от того, чего вы хотите достичь (здесь: что вы хотите сделать после поиска)

for ($length = count($array), $key = 10000; $key < $length, $key++) {
  $value = $array[$key];
}
1 голос
/ 09 марта 2012

Предполагая, что ключи являются последовательными целыми числами:

$count = count($array);
for ($key = 10000; $key < $count; ++$key) {
    $value = $array[$key];
}

Я не уверен, что число равно O (1), поэтому, если это не так, вам лучше сделать:

$key = 0;
while (isset($array[$key])) {
    $value = $array[$key];
    ++$key;
}

Обратите внимание, что array_key_exists потребуется, если ключ можно считать еще не установленным в массиве.

0 голосов
/ 09 марта 2012

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

$start = 10000; // or what ever number you're starting at
while(key($array) < $start) next($array);

Вы не можете использовать это, если планируете использовать цикл foreach (так как он сбрасывает указатель), но это будет хорошо, если вы итерируете остальную часть массива, как это

$count = count($array);
do {
  $key = key($array);
  $value = current($array);
} while($key < $count);
...