【问题标题】:in_array returns false on same characters, single character string matchingin_array 在相同的字符上返回 false,单个字符串匹配
【发布时间】:2017-09-28 18:52:58
【问题描述】:
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);
}

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

【问题讨论】:

  • 第一行有return吗?
  • str_split 不能在多字节字符串上正常工作。
  • 从第一行删除这个return $str;
  • 抱歉,返回只是为了让整个脚本正常工作
  • array_seach 也是错误的

标签: php


【解决方案1】:

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

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('áé'));

DEMO

如果出现大写字母问题,您必须将函数更改为 mb_strtouppermb_strtolowerctype_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( 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));

DEMO

【讨论】:

  • 听起来不错,演示正在运行,但不知何故,在我的文本中,它没有通过 in_array,总是错误的。
  • 旁注:(我也意识到我的回答),strtolower 也不起作用。我们很可能需要mb_strtolower
  • 检查你的字符串3v4l.org/Y9ZOh 如果你有不同的字符串,给那个字符串
【解决方案2】:

正如我提到的str_split 无法处理多字节字符串。不相信我? Have a look.

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

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));

Prints:

拉拉黄

【讨论】:

    猜你喜欢
    • 2015-07-31
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    相关资源
    最近更新 更多