Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP是否有true()函数?_Php_Arrays - Fatal编程技术网

PHP是否有true()函数?

PHP是否有true()函数?,php,arrays,Php,Arrays,我正在编写一个名为all的函数来检查数组中的所有元素$arr,返回一个布尔值(基于$f返回值)。这可以很好地传递自定义函数(请参阅已将$gte0传递给all的代码) 但是,有时需要检查数组是否包含所有true值:all(true,$arr)将不起作用,因为true作为boolean传递(并且true不是函数名)。PHP是否有本机的true()类函数 function all($f, array $arr) { return empty($arr) ? false : array_redu

我正在编写一个名为
all
的函数来检查数组中的所有元素
$arr
,返回一个
布尔值(基于
$f
返回值)。这可以很好地传递自定义函数(请参阅已将
$gte0
传递给
all
的代码)

但是,有时需要检查数组是否包含所有
true
值:
all(true,$arr)
将不起作用,因为
true
作为
boolean
传递(并且
true
不是函数名)。PHP是否有本机的
true()
类函数

function all($f, array $arr)
{
    return empty($arr) ? false : array_reduce($arr, function($v1, $v2) use ($f) {
        return $f($v1) && $f($v2);
    }, true);
}

$test = array(1, 6, 2);
$gte0 = function($v) { return $v >= 0; }

var_dump(all($gte0, $test)); // True

$test = array(true, true, false);
$id   = function($v) { return $v; } // <-- this is what i would avoid
var_dump(all($id, $test)); // False

all(true, $test); // NOT WORKING because true is passed as boolean
all('true', $test); // NOT WORKING because true is not a function
添加此函数后,使用
true
调用
all
非常好。

PHP中没有任何true()函数,您应该将该值与true进行比较

试一试

而不是

return $f($v1) && $f($v2);

我认为这应该奏效:

function all($f, array $arr)
{
    return empty($arr) ? false : array_reduce($arr, function($v1, $v2) use ($f) {
        return $f($v1) && $f($v2);
    }, true);
}

function isTrue($a)
{
    return true === $a;
}

all("isTrue", $test);
您可以使用PHP函数,如果未指定回调,它将从数组中删除所有“falsy”值:

$a = array ( true, true, false );
var_dump($a == array_filter($a));

最好传入一个函数,将值映射为布尔值,然后将其减少为最终值

function all($map, $data) {
  if (empty($data)) { return false; }
  $reduce = function($f, $n) {
    return $f && $n;
  };
  return array_reduce(array_map($map, $data), $reduce, true);
}

$gte0 = function($v) { return $v >= 0; };
$gte2 = function($v) { return $v >= 2; };

$data = array(1, 2, 3, 4, 5);
var_dump(all($gte0, $data));
var_dump(all($gte2, $data));
然后,功能的结果仍然是预期的,但是可以根据需要插入测试。您可以更进一步,允许传入map和reduce函数

function mr($map, $reduce, $data) {
  return array_reduce(array_map($map, $data), $reduce, true);
}

intval
可能会执行您正在查找的操作(尤其是在您的示例中,数组仅包含整数):

然而,对于float,它将向零舍入,所以这可能不是您想要的

更正确的“函数”与布尔值true相反:
empty
,但它不是函数,因此不能使用它(并反转返回值):

PHP中没有名为
boolval
或类似的函数,所以如果需要,可以自己编写;)

此外,您的
所有
功能都可以优化。迭代时,如果当前结果已经是
FALSE
,则最终结果将始终是
FALSE
。而且无需调用
$f()
n*2
次:

function all($f, array $arr)
{
    $result = (bool) $arr;
    foreach($arr as $v) if (!$f($v)) return FALSE;
    return $result;
}
编辑:指向
array\u filter
,它将转换为布尔值,但不提供任何函数,这似乎很酷,因为没有“boolval”函数:

$f = is_bool($f) ? ($f ? function($v) { return $v; }
    : function($v) { return !$v; } ): $f;
function all($f, array $arr)
{   
    return ($c = count($arr))
        && ($f ? $arr = array_map($f, $arr) : 1)
        && $c === count(array_filter($arr));
}

var_dump(all(0, $test)); // False

将第一个函数参数设置为可选将对每个数组元素进行适当的bool转换,这要归功于被第一句话弄糊涂了的
array\u filter

——PHP之后是否应该有句点?…或者
function isTrue($a){return(bool)$a;}
,取决于requirements@Gremo我认为引用传入
all()
的参数是相关的<代码>“isTrue”
在我的示例中是一个字符串,而
true
在你的示例中是一个bool。@DaveRandom:像
&&
这样的逻辑运算符在PHP中不是将操作数强制转换为bool吗?@hakre说得很好-但如果你有一个函数只返回唯一的参数,我会觉得可能有更好的方法来实现它……这是一个非常好的方法在我看来,误导性的代码编写方式,尤其是你的第二段代码,是很难理解的flow@yes123您应该在评论末尾添加IMHO。@Gremo:评论总是声明性的,从不分享意见。这就是为什么它们被称为注释;)谢谢,这是迄今为止最相关的答案。我会优化它。@Gremo:我编辑了它,并添加了一个
all
函数变量和
array\u filter
,这也是knittl的一个很好的指针。+1用于早期输出循环!我认为这是运行时和内存方面最好的代码(甚至比数组过滤器更好)。我也有类似的想法。顺便说一句,你应该能够只做
$result=(bool)$a;foreach($a作为$v){if(!$f($v))返回false;}返回$result,无需输入所有results@knittl:是的,很好,改变了。有时,当我如此仔细地观察代码时,我会错过一些非常有效的要点;)+1对我来说也是如此,尽管许多人认为这是“误导性代码”。我觉得这很容易理解。
var_dump(!all('empty', $test)); // Does not work!
function all($f, array $arr)
{
    $result = (bool) $arr;
    foreach($arr as $v) if (!$f($v)) return FALSE;
    return $result;
}
function all($f, array $arr)
{   
    return ($c = count($arr))
        && ($f ? $arr = array_map($f, $arr) : 1)
        && $c === count(array_filter($arr));
}

var_dump(all(0, $test)); // False