Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
otto-fukin
21 / 57 / 21
Регистрация: 15.06.2017
Сообщений: 537
#1

Each() устарела, а чем заменить не сказали

10.02.2018, 19:59. Просмотров 879. Ответов 6
Метки нет (Все метки)

сабж
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2018, 19:59
Ответы с готовыми решениями:

Чем заменить symlink()?
Хотел сделать ссылку на папку, но на хостинге отключена функция PHP symlink()....

Чем заменить header Location?
Привет! До выполнения header("Location: auth.php"); написано куча всего,...

Чем можно заменить мой велосипед?
function bar_menu ($side){ $bar_menu = get_bar_menu(); $left_menu_blocks...

В базе данных устарела информация
В базе данных устарела информация. Надо сравнивать время записи информации с...

Чем заменить split() ?
Всем доброго времени суток! Проблема такая: Нужно ловить все запросы на...

6
Jewbacabra
Эксперт PHP
3372 / 2811 / 1267
Регистрация: 24.04.2014
Сообщений: 8,516
10.02.2018, 20:20 #2
foreach`ем
0
otto-fukin
21 / 57 / 21
Регистрация: 15.06.2017
Сообщений: 537
10.02.2018, 20:32  [ТС] #3
Цитата Сообщение от Jewbacabra Посмотреть сообщение
foreach`ем
не подходит.
Первый и второй элемент массива обрабатываются одним алгоритмом, остальные, до конца - другим алгоритмом.
Переписывать целые куски программы однако.. С foreach-ем говнокодище какое-то получится. Счетчик вводить и гонять его чтобы в каждой итерации на 100000 элементов проверять не является ли элемент первым или вторым... А главное непонятно кому эта функция помешала..
0
Jewbacabra
Эксперт PHP
3372 / 2811 / 1267
Регистрация: 24.04.2014
Сообщений: 8,516
11.02.2018, 01:27 #4
Лучший ответ Сообщение было отмечено otto-fukin как решение

Решение

Цитата Сообщение от otto-fukin Посмотреть сообщение
Первый и второй элемент массива обрабатываются одним алгоритмом, остальные, до конца - другим алгоритмом.
Массив все же однородная стуктура. Если есть необходимость разные элементы обрабатывать по-разному, то вероятно следует пересмотреть алгоритм
Цитата Сообщение от otto-fukin Посмотреть сообщение
Счетчик вводить и гонять его чтобы в каждой итерации на 100000 элементов проверять не является ли элемент первым или вторым...
Cтоит заметить, что each - самый медленный способ обхода массива. if внутри foreach будет на порядок быстрее (см. бенчмарк под спойлером)
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
 * @BeforeMethods({"init"})
 * @Iterations(5)
 */
class IterBench
{
    private $array;
    private $filename;
 
    public function init()
    {
        $this->array = range(1, 1000000);
    }
 
    public function benchForeach()
    {
        foreach ($this->array as $key => $value);
    }
 
    public function benchEach()
    {
        while (list($key, $value) = each($this->array));
    }
 
    public function benchFor()
    {
        $count = count($this->array);
        for ($i = 0; $i < $count; ++$i);
    }
}
Код
/srv # ./vendor/bin/phpbench run IterBench.php --report=aggregate
PhpBench 0.14.0 (@git_version@). Running benchmarks.
Using configuration file: /srv/phpbench.json

\IterBench

    benchForeach                  I4 P0 	[μ Mo]/r: 30,202.800 29,886.746 (μs) 	[μSD μRSD]/r: 423.400μs 1.40%
    benchEach                     I4 P0 	[μ Mo]/r: 587,427.800 584,176.059 (μs) 	[μSD μRSD]/r: 6,420.265μs 1.09%
    benchFor                      I4 P0 	[μ Mo]/r: 42,743.000 42,742.724 (μs) 	[μSD μRSD]/r: 30.607μs 0.07%

3 subjects, 15 iterations, 3 revs, 0 rejects, 0 failures, 0 warnings
(best [mean mode] worst) = 29,821.000 [220,124.533 218,935.176] 30,729.000 (μs)
⅀T: 3,301,868.000μs μSD/r 2,291.424μs μRSD/r: 0.855%
suite: 133ecf2b3038570f7c4970734ecef34bc077c712, date: 2018-02-10, stime: 22:25:55
+-----------+--------------+--------+--------+------+-----+-------------+---------------+---------------+---------------+---------------+-------------+--------+--------+
| benchmark | subject      | groups | params | revs | its | mem_peak    | best          | mean          | mode          | worst         | stdev       | rstdev | diff   |
+-----------+--------------+--------+--------+------+-----+-------------+---------------+---------------+---------------+---------------+-------------+--------+--------+
| IterBench | benchForeach |        | []     | 1    | 5   | 34,638,288b | 29,821.000μs  | 30,202.800μs  | 29,886.746μs  | 30,729.000μs  | 423.400μs   | 1.40%  | 1.00x  |
| IterBench | benchEach    |        | []     | 1    | 5   | 34,638,656b | 581,722.000μs | 587,427.800μs | 584,176.059μs | 599,139.000μs | 6,420.265μs | 1.09%  | 19.45x |
| IterBench | benchFor     |        | []     | 1    | 5   | 34,638,288b | 42,696.000μs  | 42,743.000μs  | 42,742.724μs  | 42,790.000μs  | 30.607μs    | 0.07%  | 1.42x  |
+-----------+--------------+--------+--------+------+-----+-------------+---------------+---------------+---------------+---------------+-------------+--------+--------+

Цитата Сообщение от otto-fukin Посмотреть сообщение
А главное непонятно кому эта функция помешала..
https://wiki.php.net/rfc/notice-for-...er#list_access

Можно реализовать на генераторах, но скорее всего это будет медленнее foreach
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function myEach(array $array): \Generator {
    foreach ($array as $key => $value) {
        yield $key => $value;
    }
}
 
$arr = [1, 2, 3, 'foo' => 'bar'];
$gen = myEach($arr);
$first = $gen->current();
var_dump($first);
$gen->next();
$gen->next();
while ($gen->valid()) {
    var_dump($gen->key() . ' => ' .$gen->current());
    $gen->next();
}
1
полудух
145 / 161 / 42
Регистрация: 15.03.2016
Сообщений: 987
11.02.2018, 05:31 #5
Цитата Сообщение от otto-fukin Посмотреть сообщение
Первый и второй элемент массива обрабатываются одним алгоритмом, остальные, до конца - другим алгоритмом.
ну и обработайте их ЗА циклом, как-то так: $arr2[] = some_func($arr, array(0,1));
а из массива удалить unset($arr[0],$arr[1]); или if ($key === 2) {continue;} в цикле
1
otto-fukin
21 / 57 / 21
Регистрация: 15.06.2017
Сообщений: 537
11.02.2018, 05:46  [ТС] #6
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Массив все же однородная стуктура
массив-то сам однороден..
Цитата Сообщение от Jewbacabra Посмотреть сообщение
ach - самый медленный способ обхода массива. if внутри foreach будет на порядок быстрее
а вот за это спасибо! тогда появляется смысл переписать на foreach.
вобщем начал переделку на foreach с if-ом внутри цикла.
0
andr-xw
121 / 76 / 32
Регистрация: 05.03.2013
Сообщений: 447
12.02.2018, 04:24 #7
Можешь так же воспользоваться функцией http://php.net/manual/ru/function.array-shift.php, например так:
PHP
1
2
3
4
5
6
algorithmOne(array_shift($array));
algorithmOne(array_shift($array));
 
foreach ($array as $item) {
    algorithmTwo($item);
}
0
12.02.2018, 04:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2018, 04:24

exit(); чем заменить?
Есть такое: &lt;? $title = &quot;Отправка&quot;; Include(&quot;header.php&quot;); ...

Чем заменить eval
Добрый вечер. Я в php новичёк, занимаюсь им по мере поступления ошибок....

Чем можна заменить инклюд
Вопрос такой, чем можна заменить инклюд когда мне нужно например инклюдить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru