【问题标题】:Nested foreach()嵌套的 foreach()
【发布时间】:2010-11-18 10:55:55
【问题描述】:

我有以下数组:

Array ( 
  [1] => Array ( 
    [spubid] => A00319 
    [sentered_by] => pubs_batchadd.php
    [sarticle] => Lateral mixing of the waters of the Orinoco, Atabapo
    [spublication] => Acta Cientifica Venezolana
    [stags] => acta,confluence,orinoco,rivers,venezuela,waters
    [authors] => Array ( 
      [1] => Array ( 
        [stype] => Author 
        [iorder] => 1 
        [sfirst] => A
        [slast] => Andersen ) 
      [2] => Array ( 
        [stype] => Author 
        [iorder] => 2 
        [sfirst] => S.
        [slast] => Johnson ) 
      [3] => Array ( 
        [stype] => Author 
        [iorder] => 3 
        [sfirst] => J. 
        [slast] => Doe ) 
      ) 
    ) 
  )

我正在使用嵌套的 foreach() 遍历外部数组中的元素,但是在吐出作者列表时我遇到了问题。即由于疯狂的 foreach() 嵌套而导致每个输出多次(多次)的问题。在这个例子中,有什么比嵌套 foreach() 循环更好的方法?

更新(有解决方案)

这是我确定的循环,有点乱(恕我直言)但它有效:

$sauthors = NULL;
$stitle = NULL;

foreach($apubs as $apub)
{
  $stitle = $apub['sarticle'];
  foreach($apub as $svar=>$sval)
  {
    if($svar === "authors")
    {
      foreach($sval as $apeople)
      {
        $sauthors .= $apeople['slast'].", ".$apeople['sfirst']."; ";
      }
    }
  }
  echo "$sauthors<br />\n$stitle<br />\n";
}

【问题讨论】:

  • 听起来不错,也许你应该发布你的循环代码?
  • 默认情况下,嵌套循环并不是一件坏事。让我们看看一些代码。我的第一个疯狂猜测是你在内部循环中覆盖了外部循环中的一个变量:)
  • 发布您的循环代码。嵌套 foreach 很好(使用 assoc 数组可以帮助您调试)

标签: php arrays loops foreach


【解决方案1】:

如果您的问题是您在多篇文章中拥有相同的作者,因此获得了多次输出,最简单的解决方案是构建一个作者数组,而不是立即输出。

当您拥有到目前为止已处理的所有作者的数组时,您可以轻松比较该作者是否已经在其中。

【讨论】:

    【解决方案2】:

    参加look at this

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • @edorian - 我指的是 Stackoverflow 线程中的所有答案。如果他们破坏了这些链接,那将是最不幸的,所以我非常怀疑
    【解决方案3】:

    你为什么不这样做

    foreach($apubs as $apub) {
      $sauthors = '';
      $stitle = $apub['sarticle'];
      foreach($apub['authors'] as $author) {
        $sauthors .= $author['slast'].", ".$author['sfirst']."; ";
      }
    
      echo "$sauthors<br />\n$stitle<br />\n";
    }
    

    【讨论】:

      【解决方案4】:

      只是为了好玩。如果你真的想避免循环,试试这个:

      // Pre PHP 5.3:
      
      function cb2($e)
      {
          return $e['slast'] . ', ' . $e['sfirst'];
      }
      
      function cb1($e)
      {
          $authors = array_map('cb2', $e['authors']);
          echo implode('; ', $authors) . ":<br />\n" . $e['sarticle'] . "<br />\n";
      }
      
      array_walk($data, 'cb1');
      
      
      
      // PHP 5.3 (untested):
      
      array_walk($data, function($e)
      {
          $authors = array_map(function($e)
          {
              return $e['slast'] . ', ' . $e['sfirst'];
          },
          $e['authors']);
      
          echo implode('; ', $authors) . ":<br />\n" . $e['sarticle'] . "<br />\n";
      });

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-27
        • 2013-03-23
        • 1970-01-01
        • 2017-05-09
        • 2014-01-18
        • 2012-05-16
        • 1970-01-01
        • 2018-07-01
        相关资源
        最近更新 更多