У меня есть массив атрибутов, взятых из магазина woocommerce с использованием rest api. Это выглядит как:
Array
(
[0] => stdClass Object
(
[id] => 6
[name] => Modelis
[position] => 0
[visible] => 1
[variation] => 1
)
[1] => stdClass Object
(
[id] => 5
[name] => Krāsa
[position] => 1
[visible] => 1
[variation] => 1
)
)
В этом массиве я хочу найти элемент с именем «Краса». Поскольку он содержит специальные буквы «а», простое сравнение не работает:
foreach ($attributes as $item):
if (!strcmp($item->name, 'Krāsa')):
print_r('Names match');
endif;
endforeach;
Такое предложение if всегда ложно, хотя в массиве есть имя Krāsa. Может быть, это мой плохой фон, но я хотел бы знать, как правильно сравнивать такие строки?
Большое спасибо.
Как насчет использования htmlspecialchars перед сравнением строк?
^ strcmp возвращает 0, если они совпадают, поэтому можно использовать !.






В некоторых случаях, когда у вас возникают проблемы с кодировкой строк, вы можете преобразовать кодировку строк.
foreach ($attributes as $item):
if (strcmp(mb_convert_encoding($item->name, 'utf-8', 'auto'), mb_convert_encoding('Krāsa', 'utf-8', 'auto')) == 0):
print_r('Names match');
endif;
endforeach;
Ну, это то, о чем я думал. Но в моем случае ваше если никогда не бывает правдой. Это проблема. Работает для атрибутов без специальных букв. Но для слова «Krāsa» mb_convert_encoding выводит «Krāsa» из $item->name и «Kr?sa» из жестко заданной строки. Я полагаю, что utf-8 здесь неправильная кодировка.
Второй параметр — установить текущую кодировку. Вы можете увидеть текущую кодировку, используя: echo mb_detect_encoding($str);
хм, если я запускаю
!strcmp('Krāsa', 'Krāsa'), результат верный.