【问题标题】:Tricky foreach loop... how to?棘手的foreach循环......如何?
【发布时间】:2013-02-25 01:04:22
【问题描述】:

我正在循环浏览可能包含如下信息的电子表格:

To                  From
LAX/SAF/ORL         ORL/SAF
LAX/DUB             DUB/SAF
SAF/LON             LON/BNE/SYD

我需要遍历这些信息,以便得到类似的信息:

Result 1: Lax -> Orl
Result 2: Lax -> Saf
Result 3: Saf -> Orl
Result 4: Saf -> Saf
Result 5: Orl -> Orl
Result 6: Orl -> Saf

这是我目前所拥有的:

$row = "LAX/SAF/ORL";
$row2 = "ORL/SFO";
preg_match_all('([A-Za-z]+)', $row, $matches);
foreach ($matches[0] as $location_to){
    echo $location_to . " -> " . $row2 . "<br />"; //currently doesn't loop through row2
}

除了两组数据,我还能如何做到这一点?我目前被困在如何......像上面一样 foreach 两次以获得我需要的输出。

任何帮助将不胜感激(这需要通过一个循环运行,因为它是电子表格上的一行并且有其他分配的数据)。

这基本上是一种多行程条目。

谢谢

【问题讨论】:

  • $row 不应该是 $col 吗?
  • Latox - preg_match 在此目的上效率低下(尽管我收集到你现在从答案中知道这一点^^)。 @user1389596 真的吗?要争论语义和变量命名吗?如果您想成为技术人员,那将是一个“领域”,而不是专栏。对您发布的内容保持建设性。
  • @Jon 我不清楚这些是否真的是交替的数据行。
  • 这也称为二集的笛卡尔积。

标签: php


【解决方案1】:

根据你所拥有的,尝试:

$row = "LAX/SAF/ORL";
$row2 = "ORL/SFO";
$arow = explode("/", $row);
$arow2 = explode("/", $row2);
foreach($arow as $p1) {
    foreach($arow2 as $p2) {
        echo "$p1 -> $p2 <br>";
    }
}

这将创建您正在寻找的输出类型,因为您已经知道 $row$row2 是什么^^

【讨论】:

    【解决方案2】:

    实际上你已经很接近了。我会这样做:

    $row = "LAX/SAF/ORL";
    $row2 = "ORL/SFO";
    $from = explode('/', $row);
    $to   = explode('/', $row2);
    
    foreach ($from as $f){
        foreach($to as $t) {
            echo $f . " -> " . $t . "<br />";
        }
    }
    

    编辑:您可能需要为if ($f == $t) 添加检查,因为 ORL -> ORL 并没有真正意义。 :)

    【讨论】:

    • 是的 ORL -> ORL 很好,它是航班位置。我现在就试一试。
    【解决方案3】:
    1. 如果可以的话,如果它的电子表格将其读取为 CSV 格式
    2. 为什么是正则表达式? jsut 在/ 上爆炸

    然后是这样的:

    $file = fopen('/path/to/file.csv', 'r');
    // skip headers
    fseek($file, 1);
    
    while($row = fgetcsv($file)) {
       $from = explode('/', $row[0]);
       $to = explode('/', $row[1]);
    
       foreach($from as $i => $sender) {
          $recipient = isset($to[$i]) ? $to[$i] : 'undefined';
          echo "$sender -> $recipient";
       }  
    }
    

    【讨论】:

    • 刚刚投票以感谢您抽出宝贵的时间并摆脱那个肮脏的反对票!
    【解决方案4】:

    试试这个:

    $row = "LAX/SAF/ORL";
    $row2 = "ORL/SFO";
    
    $rows = array($row, $row2);
    
    foreach ($rows as $row) {
        preg_match_all('([A-Za-z]+)', $row, $matches);
        foreach ($matches[0] as $location_to){
            echo $location_to . " -> " . $row2 . "<br />"; //currently doesn't loop through row2
        }
    }
    

    基本上,您拥有的代码将为$rows 数组中的每个元素执行。

    将来,如果您有更多行(即文件的每一行),只需将它们添加到$rows 数组中,代码就会循环遍历每一行。

    【讨论】:

    • 不要为此使用preg_match。为此目的完全没有效率。
    • 我建立在问题中的代码之上,您应该在问题上发表您的评论
    • 没错,您建立在问题中的代码之上,但您只是“让它工作”而不是改进它。虽然该评论也属于该问题,但使用相同方法的每个答案都应该得到相同的评论。 ;)
    • 我同意你的观点,实际上我赞成你的回答
    【解决方案5】:
    $row = "LAX/SAF/ORL";
    $row2 = "ORL/SFO";
    $first_array = explode('/', $row);
    $second_array = explode('/', $row2);
    $result_array = array();
    $assoc_array = array();
    foreach($first_array as $value1) {
      foreach($second_array as $value2) {
        $assoc_array[$value1] = $value2;
        $result_array[] = $value1.' -> '.$value2;
      }
    }
    

    如果您愿意,这将导致您拥有一个关联的数组,或者一个具有 LAX -> ORL 形式的字符串的数组

    【讨论】:

      【解决方案6】:

      您可以使用嵌套的 foreach 并循环 $row2 匹配项,如下所示:

      $row = "LAX/SAF/ORL";
      $row2 = "ORL/SFO";
      $to_locations = explode('/', $row);
      $from_locations = explode('/', $row2);
      foreach ($to_locations as $to){
        foreach ($from_locations as $from) {
          echo $to . " -> " . $from . "<br />";
        }
      }
      

      【讨论】:

      • 我实际上只是复制了 OP 的内容。我目前正在努力改进它。
      • 今晚有人对否决票感到有点高兴..我放了两颗子弹,保存然后开始编辑以放入代码示例,当我再次保存时,我有一个投反对票。
      猜你喜欢
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      相关资源
      最近更新 更多