什么是PHP';s相当于JavaScript';s";array.every()“;?
我目前正在尝试将一些JavaScript移植到PHP。然而,我似乎找不到PHP与JavaScript什么是PHP';s相当于JavaScript';s";array.every()“;?,javascript,php,arrays,Javascript,Php,Arrays,我目前正在尝试将一些JavaScript移植到PHP。然而,我似乎找不到PHP与JavaScriptarray.every()函数的等价物。我找到了PHP的each()函数,但它似乎并不完全符合我的需要。使用带有提前返回的for循环 PHP没有执行与Javascript数组#every相同功能的本机函数。我认为您可以使用: 数组数组映射(可调用$callback,数组$array1[,数组$…])您可以使用函数。使用foreach(): 有关参考,请参阅: 注意foreach比使用arra
array.every()
函数的等价物。我找到了PHP的each()
函数,但它似乎并不完全符合我的需要。使用带有提前返回的for循环
PHP没有执行与Javascript数组#every相同功能的本机函数。我认为您可以使用:
数组数组映射(可调用$callback,数组$array1[,数组$…])您可以使用函数。使用foreach()
:
有关参考,请参阅:
注意
foreach
比使用array\u reduce()
更好,因为一旦发现不符合规范的值,计算就会停止。我很久以前写过这个原型,那是在互联网的黑暗时代,那时你永远不知道浏览器会做什么
是的,这比jQuery早了十年
是JS的。当您转换此文件时,将其用作学习PHP的良好练习
对你来说有点晚了,但我希望这对你有所帮助
if ( typeof Array.prototype.every !== 'function' )
{
Array.every = Array.prototype.every = function( _callBack, _array )
{
// Assume failure
var _matches = false;
if ( typeof _callBack === 'function' )
{
// Use ARRAY Object data or passed in data
_array = (_array === undefined) ? this : _array;
// Assume success
_matches = true;
var _len = this.length;
for ( var _i = 0; _i < _len; _i++ )
{
// If this failed, bounce out
if ( ! _callBack(this[_i], _i, _array ) )
{
_matches = false;
break;
}
}
}
return _matches;
};
if(typeof Array.prototype.every!=“函数”)
{
Array.every=Array.prototype.every=function(_回调,_数组)
{
//假定失败
var _matches=false;
if(typeof _callBack=='function')
{
//使用数组对象数据或传入的数据
_数组=(\u数组===未定义)?此:\u数组;
//假定成功
_匹配=真;
var _len=此长度;
对于(变量i=0;\u i<\u len;\u i++)
{
//如果失败,请跳出
if(!\u回调(此[\u i]、\u i、\u数组))
{
_匹配=假;
打破
}
}
}
返回匹配项;
};
}Php数组\u每个函数
function array_every($array,$callback)
{
return !in_array(false, array_map($callback,$array));
}
array_every([1,2,3],function($n){
return $n>0;
});
此页上的答案不完整,并且会更改其他语言中
每个
(JS)/所有
(Python)和类似函数的语义。映射和归约是不正确的,因为它们访问每个元素,而不考虑它们的真值
我们需要支持对任意谓词的回调,并在定位第一个谓词函数失败的元素时提供早期援助。之所以如此,是因为它提供了早期救助,但没有提供回调谓词
我们不妨边写边写一些/任何
<?php
function array_every(array $arr, callable $predicate) {
foreach ($arr as $e) {
if (!call_user_func($predicate, $e)) {
return false;
}
}
return true;
}
function array_any(array $arr, callable $predicate) {
return !array_every($arr, function ($e) use ($predicate) {
return !call_user_func($predicate, $e);
});
}
// sample predicate
function is_even($e) {
return $e % 2 === 0;
}
var_dump(array_every([0, 1, 2, 3], "is_even")); // => bool(false)
var_dump(array_every([0, 2], "is_even")); // => bool(true)
var_dump(array_any([1, 2], "is_even")); // => bool(true)
var_dump(array_any([1, 3], "is_even")); // => bool(false)
一个简单的解决方案:
函数数组\u every(数组$array,可调用$fn){
返回(bool)数组的乘积(数组映射($fn,$array));
}
在线查看:
它不是优化的,只是一个概念证明。对于生产,我将使用foreach
在第一个未通过测试的项目上返回false
。普通ol'对于循环,当测试条件为false时中断每个检查每个元素是否满足谓词?有时它被称为all
。您在下面的评论中说您不太擅长PHP,但如果您擅长javascript,请查看代码并将其转换为PHP-也许?我肯定会查看。如果使用正确,这将返回一个布尔数组,它需要再次循环,以降低性能map
变异数组。如果你有一个数组$a=(1,2,3,4)
并且你使用map:$b=array\u map(“is\u偶数,$a)
你原来的数组被改变:/$a现在是(False,True,False,True)
@BrandonBrickyKerr这与array\u map
的工作方式相反。它专门用于构建新阵列,而不是变异旧阵列。@BrandonBrickyKerr它不修改原始阵列,而是将其映射到新阵列。如果你给同一个变量分配一个新值,那就不同了。我相信这就是我需要的。:)这种方法也被设计成破坏性的,改变你的数组值。array\u reduce
很好(我经常使用它),但是你应该记住它作为你的“当一切都失败”函数。它每次都会扫描整个数组,但是只要on callback返回false,它就应该停止运行。我对这个答案投了反对票,因为即使它是一个写得很好的解决方案,它的工作方式也与“every”不同。当遇到falsy值时,“every”会提前返回(不会调用进一步的回调)。这一个将所有回调,无论它是否在其中一个回调中遇到错误的值。也许不要考虑性能,我没有考虑它,只是展示如何使它自然正确……注意foreach比使用array_reduce()更好,因为一旦发现不符合规范的值,计算将停止。上面的注释这不仅是性能问题,如果传递给each的函数有副作用,它也会触发这些副作用,实际的each函数不会:)回答得很好,因为它(a)有一个完整的代码示例,并且(b)有早期的紧急援助,但它可以改进为代替硬编码谓词。我不知道你为什么要费心链接到array\u reduce
文档——这个函数不适合这个目的(正如你所说!),而且你(正确地!)没有在代码中使用它。
function array_every($array,$callback)
{
return !in_array(false, array_map($callback,$array));
}
array_every([1,2,3],function($n){
return $n>0;
});
<?php
function array_every(array $arr, callable $predicate) {
foreach ($arr as $e) {
if (!call_user_func($predicate, $e)) {
return false;
}
}
return true;
}
function array_any(array $arr, callable $predicate) {
return !array_every($arr, function ($e) use ($predicate) {
return !call_user_func($predicate, $e);
});
}
// sample predicate
function is_even($e) {
return $e % 2 === 0;
}
var_dump(array_every([0, 1, 2, 3], "is_even")); // => bool(false)
var_dump(array_every([0, 2], "is_even")); // => bool(true)
var_dump(array_any([1, 2], "is_even")); // => bool(true)
var_dump(array_any([1, 3], "is_even")); // => bool(false)