题
时有可能使用array_map()来测试数组的值?我想确保一个数组的所有元素都是数字。
我试图既
$arrays = array(
array(0,1,2,3 )
, array ( 0,1, "a", 5 )
);
foreach ( $arrays as $arr ) {
if ( array_map("is_numeric", $arr) === FALSE ) {
echo "FALSE\n";
} else {
echo "TRUE\n";
}
}
和
$arrays = array(
array(0,1,2,3 )
, array ( 0,1, "a", 5 )
);
foreach ( $arrays as $arr ) {
if ( ( array_map("is_numeric", $arr) ) === FALSE ) {
echo "FALSE\n";
} else {
echo "TRUE\n";
}
}
和两个我得到
TRUE
TRUE
可以这样做?如果是这样,我在做什么错了?
注:我知道,我可以从一个foreach循环得到我想要的功能。
。解决方案
array_map返回一个数组。因此,它总是被认为是“真”。现在,如果你array_search
为FALSE,你也许能够得到渴望的效果。
array_map() returns an array containing all the elements of
arr1 after applying the callback function to each one.
这意味着,目前必须包含真或假的每个元素的数组。你可能会需要使用array_search(false,$array)
,以找出是否有任何虚假的值。
其他提示
我通常array_map()
,array_filter()
等大的倡导者,但在这种情况下foreach()
将是最好的选择。其原因是,与array_map()
和其他它会经过整个阵列不管。但是,对于你的目的,你只需要通过该阵列,直到你遇到了哪些is_numeric()
返回false值,而据我所知有一个在PHP没有办法摆脱这些方法。
在换句话说,如果你有你的数组中的1000项和第5一个不是数字,用array_map()
仍会检查,即使你已经知道数组没有通过测试,其余995个值。但是,如果你使用foreach()来代替,而有它break
上is_numeric() == false
,那么你只需要检查那些最初的五个要素。
您可以使用过滤器,但它有一个代码可怕位
结束$isAllNumeric = count(array_filter($arr, "is_numeric")) === count($arr)
使用自定义功能,使其成为一个好一点,但还不够完善。
$isAllNumeric = count(array_filter($arr, function($x){return !is_numeric($x);})) === 0
但如果你使用自定义函数array_reduce会的工作,但它仍然有一些缺陷。
$isAllNumeric = array_reduce($arr,
function($x, $y){ return $x && is_numeric($y); },
true);
在失败是,当它发现想要的东西也不会断裂,所以上述功能的建议不是很有效。您需要编写一个函数是这样的:
function array_find(array $array, $callback){
foreach ($array as $x){ //using iteration as PHP fails at recursion
if ( call_user_func($callback, array($x)) ){
return $x;
}
}
return false;
}
和使用它像这样
$isAllNumeric = array_find($arr, function($x){return !is_numeric($x);})) !== false;
我有两个微小的,但非常有用的功能在我的“标准库”
function any($ary, $func) {
foreach($ary as $val)
if(call_user_func($func, $val)) return true;
return false;
}
function all($ary, $func) {
foreach($ary as $val)
if(!call_user_func($func, $val)) return false;
return true;
}
在你的例子
foreach ( $arrays as $arr )
echo all($arr, 'is_numeric') ? "ok" : "not ok";
:一种更好的方法IMHO 强>:
foreach ($arrays as $array)
{
if (array_product(array_map('is_numeric', $array)) == true)
{
echo "TRUE\n";
}
else
{
echo "FALSE\n";
}
}
如果所有的值是数值和假如果任何值不是数值这将返回true。