Потрябва ми удобството на тези две хубави функции, all() и any(), каквито например ги има в Пайтън. Въпреки богатата база от функции в PHP, бързото ми търсене не показа нищо подобно, което да е вградено, затова:
function all() {
$args = func_get_args();
if (count($args) == 1 && is_array($args[0])) {
return call_user_func_array(__FUNCTION__, $args[0]);
}
foreach ($args as $value) {
if (!$value) {
return false;
}
}
return count($args) > 0;
}
Функцията any() е почти аналогична. Ако ви интересува и нейната пълна реализация, както и нещо като unit-тест, вижте пълния текст на този пост.
Ето го и нещото, приличащо на unit-тест:
function any() {
$args = func_get_args();
if (count($args) == 1 && is_array($args[0])) {
return call_user_func_array(__FUNCTION__, $args[0]);
}
foreach ($args as $value) {
if ($value) {
return true;
}
}
return false;
}
function all() {
$args = func_get_args();
if (count($args) == 1 && is_array($args[0])) {
return call_user_func_array(__FUNCTION__, $args[0]);
}
foreach ($args as $value) {
if (!$value) {
return false;
}
}
return count($args) > 0;
}
$tests = array(
array(
'any',
false,
array(false, false, false),
),
array(
'any',
false,
array(),
),
array(
'any',
true,
array(false, 1, false),
),
array(
'any',
true,
array(false, false, false, "string"),
),
array(
'any',
false,
array(false, null, false, "", false),
),
array(
'all',
false,
array(false, false, false),
),
array(
'all',
false,
array(),
),
array(
'all',
false,
array(false, 1, false),
),
array(
'all',
false,
array(false, false, false, "string"),
),
array(
'all',
false,
array(false, null, false, "", false),
),
array(
'all',
true,
array(true, "sth", 123, true, true, 1, -7),
),
);
$total = $ok = $failed = 0;
$summary = '';
function test($func, $expected, $args) {
global $total, $ok, $failed, $summary;
$total ++;
$signature = $func . '(' . implode(',', array_map(create_function('$arg', 'return var_export($arg, true);'), $args)) . '), expected: ' . var_export($expected, true);
try {
$result = call_user_func_array($func, $args);
} catch (Exception $e) {
echo 'E';
$failed ++;
$summary .= $signature . "\n";
$summary .= $e->getMessage() . "\n";
return false;
}
if ($result === $expected) {
echo '.';
$ok ++;
return true;
} else {
echo 'F';
$failed++;
$summary .= $signature . ", but got: " . var_export($result, true) . "\n";
return false;
}
}
foreach ($tests as $test_case) {
list($func, $expected, $args) = $test_case;
test($func, $expected, $args);
test($func, $expected, array($args));
}
if ($failed == 0) {
echo "\n\nALL TESTS PASSED.";
}
echo "\n\n";
echo "Tests: $total\n";
echo "OK: $ok\n";
if ($failed > 0) {
echo "FAIL: $failed\n";
}
echo "\n$summary\n";