in_array函数,为什么这不起作用?

时间:2014-04-24 20:27:40

标签: php

我试图将字符串验证为一组数字。如果字符串只包含数字,那么函数应该验证,但in_array不工作,有什么建议吗?

$list = array(0,1,2,3,4,5,6,7,8,9);
$word = 'word';
$split = str_split($word);
foreach ($split as $s) {
    if (!in_array($s, $list)) {
        print 'asdf';
    }
}

这是班级:

class Validate_Rule_Whitelist {

public function validate($data, $whitelist) {
    if (!Validate_Rule_Type_Character::getInstance()->validate($data)) {
        return false;
    }
    $invalids = array();
    $data_array = str_split($data);
    foreach ($data_array as $k => $char) {
        if (!in_array($char, $whitelist)) {
            $invalids[] = 'Invalid character at position '.$k.'.';
        }
    }
    if (!empty($invalids)) {
        $message = implode(' ', $invalids);
        return $message;
    }
    return true;
}

}

4 个答案:

答案 0 :(得分:2)

in_array与松散类型值的比较有点奇怪。在你的案例中有用的是:

$list = array('0','1','2','3','4','5','6','7','8','9');
$word = 'word';
$split = str_split($word);
foreach ($split as $s) {
    if (!in_array($s, $list, true)) {
        print 'asdf';
    }
}

这会将字符串与字符串进行比较,并且不会产生任何意外。 但是,正如评论中已经指出的那样,这是非常错误的做事方式,使用 filter_var()或正则表达式** 来实现你的目标要好得多正在努力。

答案 1 :(得分:0)

有些事情应该有效:

<?php

$validate_me = '123xyz';

if(preg_match("/[^0-9]/", $validate_me, $matches))

print "non-digit detected";

?>

答案 2 :(得分:0)

它像罪一样丑陋但它有效,这里没有优雅的解决方案,只是一个双循环,如果你看到任何问题请告诉我

$match = array();
foreach ($data_array as $k => $char) {
    foreach ($whitelist as $w) {
        if (!isset($match[$k])) {
            if ($char === $w) {
                $match[$k] = true;
            }
        }
    }
    if (!isset($match[$k]) || $match[$k] !== true) {
        $invalids[$k] = 'Invalid character at position '.$k.'.';
    }
}

答案 3 :(得分:0)

更新:添加$ type = gettype ... settype($ char,$ type)以允许===在检查整数时正常运行

foreach ($data_array as $k => $char) {
    foreach ($whitelist as $w) {
        if (!isset($match[$k])) {
            $type = gettype($w);
            if (gettype($char) !== $type) {
                settype($char, $type);
            }
            if ($char === $w) {
                $match[$k] = true;
            }
        }
    }
...