[英]PHP array_filter: if array doesn't have my value return array without changes
[英]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 中。
如果您查看字符串的字节值,您会看到:
\\x92
\\xE2\\x80\\x99
这就是您在匹配时遇到问题的原因。
你会想让这篇文章成为你的新信仰: UTF-8 一直贯穿
在不重复这个福音真理的情况下,我对处理字符编码的总体建议是:
utf8_encode()
或utf8_decode()
。
mb_convert_encoding()
或iconv()
等函数,并始终指定输入和输出编码。 [见第1点]如果您的字符串始终包含 Hello 和 Aujourd hui,请使用此正则表达式解决方法 - 请注意u
标志使其多字节兼容以将破折号和引号字符与点匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.