array_filter, кажется, не работает для слов, имеющих апостроф и тире - PullRequest
0 голосов
/ 04 марта 2020

У меня есть php код , как показано ниже:

<code>$variable = \CTIME\DataPoint\get_message();  // Line A
echo '<pre>'; print_r($variable); echo '
'; // Строка B echo '
'; var_dump($variable); echo '
'; // Line C print_r (array_filter ($ variable, function ($ i) {return $ i-> top_portion == 'Hello - World';})); // Строка 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
(
)

Ответы [ 3 ]

3 голосов
/ 12 марта 2020

Ваш код кажется хорошим.
Я предполагаю, что это проблема с набором символов: «правильная одинарная кавычка» (') является символом Unicode и не является частью набора символов ASCII.

Если строка из исходных данных и строка в вашем скрипте PHP используют отдельную кодировку, они могут отличаться (не одна и та же последовательность байтов).

Например, если вы используете UTF-8: убедитесь, что данные, которые вы выбираете с get_live_today_streams(), имеют кодировку UTF-8, и убедитесь, что ваш файл .php имеет кодировку UTF-8. а также.

(посмотрите на этот пост , чтобы узнать, как преобразовать файл ANSI в UTF-8 с помощью блокнота ++)

2 голосов
/ 14 марта 2020

У вас несоответствие кодировки, и я держу пари, что это между 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]
    • Даже когда они встречают обнаруживаемую недопустимую последовательность байтов , они не предпринимают никаких попыток заботы и просто вводят tra sh в вывод.
  4. Всегда используйте такие функции, как mb_convert_encoding() или iconv() и всегда указывать кодировку ввода и вывода. [см. пункт 1]
0 голосов
/ 16 марта 2020

Если ваша строка всегда содержит Hello и Aujourd hui, используйте этот обходной путь регулярного выражения - обратите внимание на флаг u, который делает его многобайтовым совместимым, чтобы соответствовать da sh и заключать в кавычки символы с точкой.

https://3v4l.org/Xe0Rg

...