【问题标题】:array_filter doesn't seems to work for words having apostrophe and dasharray_filter 似乎不适用于带有撇号和破折号的单词
【发布时间】:2020-06-17 07:44:48
【问题描述】:

我有一个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
(
)

【问题讨论】:

  • 对我来说很好:3v4l.org/FOjXu
  • 它工作正常..
  • 和 P.S.:您是分配过滤后的数组还是只是期望通过引用过滤传递的数组(这里谈论 array_filter() 的返回值)?
  • @flash 谢谢,似乎仍然有效。你能回答我关于返回值的问题吗?即当你说“它打印”时 - 实际打印的代码在哪里?并且返回值是否赋值?
  • 很奇怪,你有没有机会获得(或其他)一个 phpinfo() 输出?另外:如果您从此处粘贴的 3v4ls 中复制并粘贴确切的代码(包括硬编码的数据数组),它可以在您的机器上运行吗?还是没有?

标签: php arrays unicode utf-8 array-filter


【解决方案1】:

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

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

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

(查看at this post 了解如何使用 notepad++ 将 ANSI 文件转换为 UTF-8)

【讨论】:

    【解决方案2】:

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

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

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

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

    这就是您无法匹配的原因。

    你会希望这篇文章成为你的新宗教:UTF-8 all the way through

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

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

    【讨论】:

      【解决方案3】:

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

      https://3v4l.org/Xe0Rg

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-12
        • 1970-01-01
        • 2021-02-10
        • 1970-01-01
        • 1970-01-01
        • 2016-01-08
        • 1970-01-01
        相关资源
        最近更新 更多