PHP测试数组_walk结果
我确信这是一个简单的解决方案——我编写了一个endswith函数,并认为我应该尝试array_walk函数,而不是单独测试每个字符串。我假设array_walk函数的结果为false,但它返回1…如果没有找到匹配项,如何让它测试所有字符串并返回false?谢谢PHP测试数组_walk结果,php,Php,我确信这是一个简单的解决方案——我编写了一个endswith函数,并认为我应该尝试array_walk函数,而不是单独测试每个字符串。我假设array_walk函数的结果为false,但它返回1…如果没有找到匹配项,如何让它测试所有字符串并返回false?谢谢 class { function endsWith($value,$key,$haystack) { $length = strlen($value); if ($length ==
class {
function endsWith($value,$key,$haystack)
{
$length = strlen($value);
if ($length == 0) {
return true;
}
return (substr($haystack, -$length) === $value);
}
function thing()
{
$email = "should@returnfalse.info";
$arr = array("@test.net","@test.org.uk","@test.co.uk","@test.com");
echo array_walk($arr,array($this,"endsWith"),$email);
}
}
试试这个
class {
function thing()
{
$email = "should@returnfalse.info";
$arr = array("@test.net","@test.org.uk","@test.co.uk","@test.com");
foreach ($arr as $domain) {
$length = strlen($value);
if ($length != 0) {
if (substr($email, -$length) === $domain) { echo $domain; break; }
}
}
}
}
试试这个
class {
function thing()
{
$email = "should@returnfalse.info";
$arr = array("@test.net","@test.org.uk","@test.co.uk","@test.com");
foreach ($arr as $domain) {
$length = strlen($value);
if ($length != 0) {
if (substr($email, -$length) === $domain) { echo $domain; break; }
}
}
}
}
array\u walk()
只要在数组的元素上迭代,并返回true
,如果它能够这样做的话。(echo
将booleatrue
强制转换为字符串'1'
)请查看array\u recude()
附加的$key
在endsWith()
array\u walk()
中没有使用,也没有用处。如果能够执行,它只需迭代数组的元素并返回true
。(echo
将booleatrue
强制转换为字符串'1'
)请查看array\u recude()
附加的
$key
在endsWith()中未使用且无用
如果要将函数应用于所有值并返回单个结果,则应使用array\u reduce
如果要将函数应用于所有值并返回单个结果,则应使用array\u reduce的返回值不取决于回调所做的任何操作;它只会通知您是否已成功完成对整个阵列的遍历
您可能需要研究一些替代方案
这将返回匹配元素的数量,也将用作布尔测试,但无论发生什么情况,它都将计算每个元素:
echo count(array_filter($arr,array($this,"endsWith")));
一旦检测到匹配项,这将停止使用endsWith
对元素进行求值,如果存在匹配项,则返回true
,否则返回false
:
$self = $this;
// cast to int because false is printed as the empty string
echo (int)array_reduce($arr,
function($result, $v) use ($email, $self) {
return $result || $self->endsWith($v, null, $email);
},
false);
的返回值不由回调所做的任何操作确定;它只会通知您是否已成功完成对整个阵列的遍历
您可能需要研究一些替代方案
这将返回匹配元素的数量,也将用作布尔测试,但无论发生什么情况,它都将计算每个元素:
echo count(array_filter($arr,array($this,"endsWith")));
一旦检测到匹配项,这将停止使用endsWith
对元素进行求值,如果存在匹配项,则返回true
,否则返回false
:
$self = $this;
// cast to int because false is printed as the empty string
echo (int)array_reduce($arr,
function($result, $v) use ($email, $self) {
return $result || $self->endsWith($v, null, $email);
},
false);
从PHP 5.3开始,您可以使用匿名函数:
class {
function thing()
{
$email = "should@returnfalse.info";
$arr = array("@test.net","@test.org.uk","@test.co.uk","@test.com");
$match = '';
$found = false;
array_walk($arr,function($value) use (&$match, &$found, $email) {
$length = strlen($value);
if ($length == 0) {
$found = true;
return;
}
if (substr($email, -$length) === $value) {
$match = $value;
$found = true;
}
});
if ($found) {
echo 'Found match: ' . $match;
} else {
echo 'No match found :(';
}
}
}
从PHP 5.3开始,您可以使用匿名函数:
class {
function thing()
{
$email = "should@returnfalse.info";
$arr = array("@test.net","@test.org.uk","@test.co.uk","@test.com");
$match = '';
$found = false;
array_walk($arr,function($value) use (&$match, &$found, $email) {
$length = strlen($value);
if ($length == 0) {
$found = true;
return;
}
if (substr($email, -$length) === $value) {
$match = $value;
$found = true;
}
});
if ($found) {
echo 'Found match: ' . $match;
} else {
echo 'No match found :(';
}
}
}
如果数组_walk通过所有元素,则始终为true;false-如果array\u walk无法尝试此操作:var\u dump($arr);array_walk($arr,array($this,“endsWith”),$email);var_转储($arr);如果数组_walk通过所有元素,则始终为true;false-如果array\u walk无法尝试此操作:var\u dump($arr);array_walk($arr,array($this,“endsWith”),$email);var_转储($arr);即使存在匹配项(PHP5.3),array_reduce解决方案也会返回0,但我要看看是否可以让它工作,它看起来很整洁。Thanks@JimSMith当前位置我误解了你在这里的意图。更新后的答案应该可以按原样工作。即使存在匹配项(PHP5.3),array_reduce解决方案也会返回0,但我要看看是否可以让它工作,它看起来很整洁。Thanks@JimSMith当前位置我误解了你在这里的意图。更新后的答案应按原样工作。谢谢,这返回了一个意外的“)”错误不确定问题是什么Hanks,这返回了一个意外的“)”错误不确定问题是什么