Я бы пошел с подходом сгиба:
function sift($array, $key, $value) {
return array_reduce($array, function ($a, $elem) use ($key, $value) {
$elem[$key] == $value ? $a[0] = $elem : $a[1] = $elem;
}, array());
}
$bots = sift($array, 'job_id', 2);
executeBots($bots[0]);
Этот IMO в основном улучшает «интерфейс», устраняя переход по ссылке + возврат и возвращая «сгруппированный» массив. PHP может быть в состоянии оптимизировать это лучше внутри, и, следовательно, может быть более эффективным, но я не знаю, насколько это действительно так. Хотя стоит попробовать.
Хорошо, небольшое тестирование показывает, что на самом деле это намного медленнее . Но, если вы только фильтруете интересующих вас ботов и отбрасываете остальных, array_filter
может дать толчок. Если вы все равно отказываетесь, полное удаление ненужных значений является самым быстрым:
$bots = array();
for ($i = 0; $i < 100000; $i++) {
$bots = array('job_id' => mt_rand(1, 100));
}
function sift_reduce($array, $key, $value) {
return array_reduce($array, function ($a, $elem) use ($key, $value) {
$elem[$key] == $value ? $a[0] = $elem : $a[1] = $elem;
}, array());
}
function sift_filter($array, $key, $value) {
return array_filter($array, function ($elem) use ($key, $value) { return $elem[$key] == $value; });
}
function sift_unset(&$array, $key, $value) {
foreach ($array as $k => $elem) {
if ($elem[$key] != $value) {
unset($array[$k]);
}
}
}
function sift_array(&$array, $key, $value){
foreach($array as $element){
if($element[$key] == $value){$temp[] = $element;}
else{$temp2[] = $element;}
}
$array = $temp2;
return $temp;
}
$start = microtime(true);
$sifted = sift_reduce($bots, 'job_id', 5);
echo "reduce: " . (microtime(true) - $start) * 1000 . "\n";
$start = microtime(true);
$sifted = sift_filter($bots, 'job_id', 5);
echo "filter: " . (microtime(true) - $start) * 1000 . "\n";
$botsCopy = $bots;
$start = microtime(true);
sift_unset($botsCopy, 'job_id', 5);
echo "unset: " . (microtime(true) - $start) * 1000 . "\n";
$start = microtime(true);
$sifted = sift_array($bots, 'job_id', 5);
echo "array: " . (microtime(true) - $start) * 1000 . "\n";
Дает:
reduce: 0.072002410888672
filter: 0.013828277587891
unset: 0.0088214874267578
array: 0.016927719116211