Php in_数组在相同字符上返回false,单字符串匹配

Php in_数组在相同字符上返回false,单字符串匹配,php,Php,在这个函数中,即使我从$special数组中输入字符,In_array()每次都返回false,如果我对我试图解析的常规文本var_dump(),输出将只是bool(false),没有马赫数,即使我将字符从源复制粘贴到数组。此外,我正在寻找使这个字符替换工作正常的方法。正如我提到的stru-split无法处理多字节字符串。不相信我 无论如何,这里有一个可以拆分多字节字符串的版本: function make_ascii($str) { $special = array('ľ','š','

在这个函数中,即使我从
$special
数组中输入字符,
In_array()
每次都返回false,如果我对我试图解析的常规文本
var_dump()
,输出将只是
bool(false)
,没有马赫数,即使我将字符从源复制粘贴到数组。此外,我正在寻找使这个字符替换工作正常的方法。

正如我提到的
stru-split
无法处理多字节字符串。不相信我

无论如何,这里有一个可以拆分多字节字符串的版本:

function make_ascii($str) {
    $special = array('ľ','š','č','ť','ž','ý','á','í','é','ú','ä','ô','ň','ě');
    $ascii =   array('l','s','c','t','z','y','a','i','e','u','a','o','n','e');
    $str = str_split($str);
    foreach ($str as $k => $c) {
        if(ctype_upper($c)) {
            $u = true;
            $c = strtolower($c);
        } else {
            $u = false;
        }
        if(in_array($c, $special, false)) {
            $c = $ascii[array_search($c, $special)];
        }
        if($u) {
            $c = strtoupper($c);
        }
        $str[$k] = $c;
    }
    return join($str);
}

拉拉黄


由于
str_split
不适用于多字节,因此必须使用
mb_
执行多字节字符串操作

function make_ascii($str) {

    $special = array('ľ','š','č','ť','ž','ý','á','í','é','ú','ä','ô','ň','ě');
    $ascii =   array('l','s','c','t','z','y','a','i','e','u','a','o','n','e');
    $str = preg_split("//u",$str);
    foreach ($str as $k => $c) {
        if(ctype_upper($c)) {
            $u = true;
            $c = mb_strtolower($c);
        } else {
            $u = false;
        }
        if(in_array($c, $special, false)) {
            $c = $ascii[array_search($c, $special)];
        }
        if($u) {
            $c = mb_strtoupper($c);
        }
        $str[$k] = $c;
    }
    return join($str);
}

$str = "ľaľa ýellow";

print_r(make_ascii($str));

如果大写字母出现问题,您必须将函数更改为
mb\u strotop
mb\u strotlower
。另外
ctype\u upper
将不起作用,因此也将其更改

function make_ascii($str) {
    //return $str;
    $special = array('ľ','š','č','ť','ž','ý','á','í','é','ú','ä','ô','ň','ě');
    $ascii =   array('l','s','c','t','z','y','a','i','e','u','a','o','n','e');
    $str = array_map(function ($i) use ($str) { 
    return mb_substr($str, $i, 1); 
}, range(0, mb_strlen($str) -1));
    foreach ($str as $k => $c) {
        if(ctype_upper($c)) {
            $u = true;
            $c = strtolower($c);
        } else {
            $u = false;
        }
       // print_r($c);
        if(in_array($c, $special)) {
            $c = $ascii[array_search($c, $special)];
        }
        if($u) {
            $c = strtoupper($c);
        }
        $str[$k] = $c;
    }
    return join($str);
}
var_dump(make_ascii('áé'));

您在第一行有一个返回值?
str\u split
在多字节字符串上无法正常工作。请删除此
return$str从第一行开始抱歉,返回值只是为了让整个脚本正常工作。
array\seach
也是错误的听起来不错,演示正在工作,但不知怎么的,我的文本在数组中没有通过,这总是会出错。旁注:(我也意识到了我的答案),
strtolower
也不会工作。我们可能需要检查您的字符串,如果您有不同的字符串,请给出该字符串
function make_ascii($str) {
    //return $str;
    $special = array('ľ','š','č','ť','ž','ý','á','í','é','ú','ä','ô','ň','ě');
    $ascii =   array('l','s','c','t','z','y','a','i','e','u','a','o','n','e');
    $str = array_map(function ($i) use ($str) { 
    return mb_substr($str, $i, 1); 
}, range(0, mb_strlen($str) -1));

    foreach ($str as $k => $c) {
        if( mb_strtoupper($c, "UTF-8") == $c) {
            $u = true;
            $c = mb_strtolower($c);
        } else {
            $u = false;
        }
       // print_r($c);
        if(in_array($c, $special)) {
            $c = $ascii[array_search($c, $special)];
        }
        if($u) {
            $c = mb_strtoupper($c);
        }
        $str[$k] = $c;
    }
    return join($str);
}
$str = "ľÁľa ýellow";
var_dump(make_ascii($str));