#php #foreach #compare
#php #foreach #Сравнить
Вопрос:
У меня есть несколько данных синтаксического анализа foreach, которые мне нужно сравнить друг с другом. Например:
foreach ($xml_string->xpath('//location') as $character) {
$xml_name = $character->earthname;
$compare_remote = strtolower(preg_replace("/[^a-zA-Z0-9 ]/", "", $xml_name));
}
foreach ( $whatever as $key => $value ) {
foreach ($value as $pkey){
$value_name = $pkey["spacename"];
$compare_local = strtolower(preg_replace("/[^a-zA-Z0-9]/", '', $value_name));
}
}
Как я могу перебрать оба набора foreach, чтобы сравнить все значения в $compare_remote
со значениями в $compare_local
, которые я, вероятно, буду использовать levenshtein()
, но для этого примера подойдет что угодно.
Ответ №1:
foreach ($xml_string->xpath('//location') as $character) {
$xml_name = $character->earthname;
$compare_remote = strtolower(preg_replace("/[^a-zA-Z0-9 ]/", "", $xml_name));
foreach ( $whatever as $key => $value ) {
foreach ($value as $pkey){
$value_name = $pkey["spacename"];
$compare_local = strtolower(preg_replace("/[^a-zA-Z0-9]/", '', $value_name));
if( $compare_remote==$compare_local) echo "match";
}
}
}
Комментарии:
1. Нет, это может привести к бесконечному циклу.
2. @Wyck как так получилось? какая у вас
$whatever
переменная? Это перебирает ваш$string->path
запрос, а затем сравнивает со значениями в$wahtever
массиве, который у вас там есть.3. Переменная $whatever на самом деле является глобальным массивом, я должен был упомянуть об этом.
4. @Whyck Dot ‘ поймите меня неправильно, но это не объясняет, почему они застряли в бесконечном цикле?? Если
$whatever
переменная является глобальной и имеет значения массива soem, и если она не ссылается на значения из ` foreach ($xml_string->xpath(‘//location’) как символ $)`, то возможность бесконечного цикла такая же, как в вашем примере. Кроме того, вы ничего не присваиваете. Итак, опять же, возможность та же. Но в любом случае, если вы не готовы попробовать решение…5. Да, я был неправ, извините, у меня там был какой-то дополнительный код, которого я не видел, ваше решение действительно работает.
Ответ №2:
Не зная, что вы сравниваете, вы могли бы использовать ассоциативный массив вне обоих циклов в качестве поиска по ключу / значению. Если есть общий ключ, то вы можете оперировать теми же значениями, которые были вычислены обоими циклами. В идеале, я знаю, вы хотите выполнить итерацию по обеим переменным одновременно, но это может привести к одному вычисляемому набору данных. Уникальные ключи сохраняются.
$compare[];
foreach ($xml_string->xpath('//location') as $character) {
$xml_name = $character->earthname;
$compare[strtolower(preg_replace("/[^a-zA-Z0-9 ]/", "", $xml_name))];
}
foreach ( $whatever as $key => $value ) {
foreach ($value as $pkey){
$value_name = $pkey["spacename"];
$compare[strtolower(preg_replace("/[^a-zA-Z0-9]/", '', $value_name))];
}
}
Комментарии:
1. Спасибо, я думаю, это то, что я ищу, я все еще не уверен на 100%, как это реализовать, хотя, если вы случайно знаете какую-либо документацию, я был бы признателен.
2. Вы можете использовать одно и то же значение для ключа и value. Итак, сравните[$name]=$name; В идеале вы проверяете, есть ли общий набор ключей (сравните[$name]), а затем сделайте что-нибудь полезное. Может быть, приведите нам пример того, что вы сравниваете, и, возможно, мы сможем помочь. Когда я думаю о compare, я буквально думаю, что где-то есть тест, подобный if ($name == $othername), но вы не даете нам столько информации.
3. Я сравниваю только текстовые строки, но я не знаю значений, такие вещи, как «все в одном», «фруктовый салат», «Торонто», просто обычные слова. Первый цикл представляет собой XML-файл, а второй — массив слов, мне просто нужно найти совпадающие, но не все они написаны правильно, например «корзина с фруктами», «Fruit-basket».