PHP8: элегантное и быстрое увеличение неустановленных индексов ⇐ Php
-
Anonymous
PHP8: элегантное и быстрое увеличение неустановленных индексов
PHP8 выдает предупреждение, если индекс не установлен.
В PHP7 следующий (очень упрощенный) фрагмент раньше был «грязным», но очень читаемым и рабочим решением для подсчета данных в соответствии с их ключом на лету (например, в алгоритмах переиндексации):
$keylist = array('keyA','keyB','keyA','keyA'); $idx_count = массив(); foreach ($keylist как $thiskey){ $idx_count[$thiskey]++; } Решения в PHP8, требующие проверки существования индекса, как при проверке с помощью isset():
$keylist = array('keyA','keyB','keyA','keyA'); $idx_count = массив(); foreach ($keylist как $thiskey){ if (!isset($idx_count[$thiskey]){ $idx_count[$thiskey] = 0; } $idx_count[$thiskey]++; } или проверка с помощью пустой():
$keylist = array('keyA','keyB','keyA','keyA'); $idx_count = массив(); foreach ($keylist как $thiskey){ if (empty($idx_count[$thiskey]){$idx_count[$thiskey] = 0; } $idx_count[$thiskey]++; } или с ветвлением:
$keylist = array('keyA','keyB','keyA','keyA'); $idx_count = массив(); foreach ($keylist как $thiskey){ if (!isset($idx_count[$thiskey]){ $idx_count[$thiskey] = 1; }еще{ $idx_count[$thiskey]++; } } или используя нулевую операцию объединения:
$keylist = array('keyA','keyB','keyA','keyA'); $idx_count = массив(); foreach ($keylist как $thiskey){ $idx_count[$thiskey] ??= 0; $idx_count[$thiskey]++; } Вопросы:
1. Помимо ухудшения читабельности, как эти параметры влияют на производительность при использовании очень больших $keylists?
В любом случае это дополнительное сравнение в каждом цикле, тогда как внутренняя «ловушка» в PHP7 (вероятно) повлияла только на первую итерацию.
2. Есть ли элегантный способ сделать это читабельным и быстрым одновременно?
PHP8 выдает предупреждение, если индекс не установлен.
В PHP7 следующий (очень упрощенный) фрагмент раньше был «грязным», но очень читаемым и рабочим решением для подсчета данных в соответствии с их ключом на лету (например, в алгоритмах переиндексации):
$keylist = array('keyA','keyB','keyA','keyA'); $idx_count = массив(); foreach ($keylist как $thiskey){ $idx_count[$thiskey]++; } Решения в PHP8, требующие проверки существования индекса, как при проверке с помощью isset():
$keylist = array('keyA','keyB','keyA','keyA'); $idx_count = массив(); foreach ($keylist как $thiskey){ if (!isset($idx_count[$thiskey]){ $idx_count[$thiskey] = 0; } $idx_count[$thiskey]++; } или проверка с помощью пустой():
$keylist = array('keyA','keyB','keyA','keyA'); $idx_count = массив(); foreach ($keylist как $thiskey){ if (empty($idx_count[$thiskey]){$idx_count[$thiskey] = 0; } $idx_count[$thiskey]++; } или с ветвлением:
$keylist = array('keyA','keyB','keyA','keyA'); $idx_count = массив(); foreach ($keylist как $thiskey){ if (!isset($idx_count[$thiskey]){ $idx_count[$thiskey] = 1; }еще{ $idx_count[$thiskey]++; } } или используя нулевую операцию объединения:
$keylist = array('keyA','keyB','keyA','keyA'); $idx_count = массив(); foreach ($keylist как $thiskey){ $idx_count[$thiskey] ??= 0; $idx_count[$thiskey]++; } Вопросы:
1. Помимо ухудшения читабельности, как эти параметры влияют на производительность при использовании очень больших $keylists?
В любом случае это дополнительное сравнение в каждом цикле, тогда как внутренняя «ловушка» в PHP7 (вероятно) повлияла только на первую итерацию.
2. Есть ли элегантный способ сделать это читабельным и быстрым одновременно?
Мобильная версия