PHP测试数组_walk结果

PHP测试数组_walk结果,php,Php,我确信这是一个简单的解决方案——我编写了一个endswith函数,并认为我应该尝试array_walk函数,而不是单独测试每个字符串。我假设array_walk函数的结果为false,但它返回1…如果没有找到匹配项,如何让它测试所有字符串并返回false?谢谢 class { function endsWith($value,$key,$haystack) { $length = strlen($value); if ($length ==

我确信这是一个简单的解决方案——我编写了一个endswith函数,并认为我应该尝试array_walk函数,而不是单独测试每个字符串。我假设array_walk函数的结果为false,但它返回1…如果没有找到匹配项,如何让它测试所有字符串并返回false?谢谢

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
将boolea
true
强制转换为字符串
'1'
)请查看
array\u recude()

附加的
$key
endsWith()

array\u walk()
中没有使用,也没有用处。如果能够执行,它只需迭代数组的元素并返回
true
。(
echo
将boolea
true
强制转换为字符串
'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,这返回了一个意外的“)”错误不确定问题是什么