繁体   English   中英

array_filter 似乎不适用于带有撇号和破折号的单词

[英]array_filter doesn't seems to work for words having apostrophe and dash

我有一个php 代码,如下所示:

$variable = \CTIME\DataPoint\get_message();  // Line A
echo '<pre>'; print_r($variable); echo '</pre>';  // Line B
echo '<pre>'; var_dump($variable); echo '</pre>';  // Line C
print_r(array_filter($variable, function ($i) { return $i->top_portion == 'Hello – World'; }));  // Line D

B行打印:

Array
(
    [0] => stdClass Object
        (
            [language] => en
            [client_id] => 12345
            [top_portion] => Hello World
        )
    [1] => stdClass Object
        (
            [language] => en
            [client_id] => 56789
            [top_portion] => Hello – World
        )

)

C行打印:

array (
  0 => 
  (object) array(
     'language' => 'en',
     'client_id' => 12345,
     'top_portion' => 'Hello World',
  ),
  1 => 
  (object) array(
     'language' => 'en',
     'client_id' => 56789,
     'top_portion' => 'Hello – World',
  ),
)

D 行打印:

Array 
(
)

问题陈述:

我想知道我需要添加什么 PHP 代码,以便它只打印具有[top_portion] => Hello – World 的对象

Array
(
    [0] => stdClass Object
        (
            [language] => en
            [client_id] => 56789
            [top_portion] => Hello – World
        )
)

这是我尝试过的

print_r(array_filter($variable, function ($i) { return $i->top_portion == 'Hello – World'; }));

它打印;

Array
(
)

你的代码看起来不错。
我的猜测是这是一个字符集问题:“右单引号”(')是一个 unicode 字符,而不是 ASCII 字符集的一部分。

如果源数据中的字符串和 PHP 脚本中的字符串使用不同的字符集,则它们可能不同(不是相同的字节序列)。

例如,如果您使用 UTF-8:检查您使用get_live_today_streams()获取的数据是否为 ​​UTF-8 编码,并确保您的.php文件也是 UTF-8 编码。

(查看这篇文章,了解如何使用记事本++将 ANSI 文件转换为 UTF-8)

您的编码不匹配,我敢打赌它介于 UTF-8 和 MS cp1252 之间。

cp1252 是 Microsoft 使用的单字节编码,经常与 ISO8859-1 混淆。 虽然许多代码点在两者中映射到相同的字形,但有一些显着的差异,比如' ,因为它只出现在 cp1252 中。

如果您查看字符串的字节值,您会看到:

  • cp1252: \\x92
  • UTF-8: \\xE2\\x80\\x99

这就是您在匹配时遇到问题的原因。

你会想让这篇文章成为你的新信仰: UTF-8 一直贯穿

在不重复这个福音真理的情况下,我对处理字符编码的总体建议是:

  1. 永远不要假设字符编码,始终明确设置它。
  2. 永远不要尝试检测字符编码,因为它几乎不可能做到任何级别的准确度。
  3. 永远不要使用utf8_encode()utf8_decode()
    • 它们只会在 ISO8859-1 和 UTF-8 之间转换。
    • 他们不会尝试检查输入是否是他们期望的编码。 [见第2点]
    • 即使当他们遇到可检测到的无效字节序列时,他们也不会尝试关心并且会简单地将垃圾引入输出。
  4. 始终使用mb_convert_encoding()iconv()等函数,并始终指定输入和输出编码。 [见第1点]

如果您的字符串始终包含 Hello 和 Aujourd hui,请使用此正则表达式解决方法 - 请注意u标志使其多字节兼容以将破折号和引号字符与点匹配。

https://3v4l.org/Xe0Rg

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM