если у меня есть массив флагов, и я хочу объединить их с поразрядным соединением
то есть:
$foo = array(flag1, flag2);
в
$bar = flag1 | flag2;
Есть ли у PHP какие-либо хорошие функции, которые сделают это для меня уже хорошо?
array_reduce
уменьшит массив до одного значения для вас:
$res = array_reduce($array, function($a, $b) { return $a | $b; }, 0);
Сокращение также иногда называется fold (fold left или fold right) на других языках.
Вы могли бы так сделать
$bar = $foo[0] | $foo[1]
Если размер вашего массива неизвестен, вы можете использовать array_reduce, как это
// in php > 5.3 $values = array_reduce($flagArray, function($a, $b) { return $a | $b; }); // in php <= 5.2 $values = array_reduce($flagArray, create_function('$a, $b', 'return $a | $b'));
$values = array_reduce($foo,function($a,$b){return is_null($a) ? $b : $a | $b;});
PHP <5.3 (без закрытия), любой из этих двух:
function _mybitor($a,$b){return is_null($a) ? $b : $a | $b;} $values = array_reduce($foo,'_mybitor');
или
$values = array_reduce($foo,create_function('$a,$b','return is_null($a) ? $b : $a | $b;'));
);
Простое предложение к принятому ответу : создайте родного брата для array_sum
.
function array_or (array $array): int { return array_reduce($array, function($a, $b) { return $a | $b; }, 0); }