【问题标题】:Compare nested foreach variables in php without globals?比较没有全局变量的php中嵌套的foreach变量?
【发布时间】:2011-04-23 04:24:33
【问题描述】:

我有多个 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(),但为了这个示例,任何事情都可以。

【问题讨论】:

    标签: php foreach compare


    【解决方案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";
              }
            }
    
     }
    

    【讨论】:

    • 不,这会导致无限循环。
    • @Wyck 怎么来的?你的$whatever 变量是什么?这是循环您的 $string->path 查询,然后与您在那里的 $wahtever 数组中的值进行比较。
    • $whatever 变量实际上是一个全局数组,我应该提到这一点。
    • @Whyck Dot' 误会我的意思,但这并不能解释为什么会陷入无限循环?如果$whatever 变量是全局变量并且具有一些数组值,并且如果不引用来自`foreach ($xml_string->xpath('//location') as $character)` 的值,则无限循环的可能性与你的例子。此外,您没有分配任何东西。所以再次,可能性是一样的。但无论如何,如果你不愿意尝试解决方案......
    • 是的,我错了,对不起,我没有看到一些额外的代码,你的解决方案确实有效。
    【解决方案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))];
    
     }
    }
    

    【讨论】:

    • 谢谢,我想这就是我要找的东西,但我仍然不能 100% 确定如何实现它,如果您碰巧知道任何文档,我将不胜感激。
    • 您可以对 Key 和 value 使用相同的值。所以比较[$name]=$name;理想情况下,您检查是否有一个公共密钥 isset(compare[$name]),然后做一些有用的事情。也许给我们一个例子来说明你的比较,也许我们可以提供帮助。当我想到比较时,我真的认为有一个测试,比如 if ($name == $othername),但你没有给我们那么多信息。
    • 我只比较文本字符串,但我不知道值,例如“all in one”、“fruit salad”、“toronto”之类的东西,只是普通单词。第一个循环是一个 XML 文件,第二个是单词数组,我只需要找到匹配的,但它们的拼写并不正确,例如“fruit basket”“Fruit-basket”。
    猜你喜欢
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多