嵌套的 foreach()

Posted

技术标签:

【中文标题】嵌套的 foreach()【英文标题】:Nested 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() 循环更好的方法?

更新(有解决方案)

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

$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 数组可以帮助您调试) 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

参加look at this

【讨论】:

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

【讨论】:

以上是关于嵌套的 foreach()的主要内容,如果未能解决你的问题,请参考以下文章

Foreach嵌套Foreach速度慢优化方案

php foreach 嵌套循环大数组很慢?

交替循环嵌套的foreach循环

PowerShell 中的嵌套 ForEach()

SwiftUI 嵌套 ForEach 应该只用于 *constant* 数据

嵌套的 Foreach 循环花费了太多时间