Сравнивать вложенные переменные foreach в php без глобалов?

#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».