PHP-функции any() и all()


Потрябва ми удобството на тези две хубави функции, 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";

, , , , ,

Comments are closed.