【问题标题】:php foreach loop with continue if value has already been echoed如果值已经被回​​显,则带有 continue 的 php foreach 循环
【发布时间】:2014-11-13 09:00:55
【问题描述】:

我有一个 foreach 循环,如果值已经被回​​显,我需要添加一个 continue。我找不到正确的语法。循环:

foreach ($results as $result) {
   echo $result->date . "<br />"; 
}

但是我需要添加一个 continue ,以便如果该值已经被回​​显,并且它在循环中再次出现,它将被跳过。我不能完全正确地理解 if/continue 语句。

想法、建议、想法?

【问题讨论】:

  • 通常情况下,您会在回显每个日期时将日期添加到数组中,如果 in_array 继续。
  • 根据单个$result 的性质,$results = array_unique($results) 在循环之前也可能有所帮助。
  • @andy 这是一个对象,你可以从代码中看出。
  • @CharlotteDunois 我可以看到。但是,如果对象以正确的方式实现 __toString(),它将起作用并产生 IMO 可读代码。

标签: php joomla


【解决方案1】:

正如@JonathanKuhn 在 cmets 中提到的那样 - 这是您运行该循环的方式:

$already_echoed = array();
foreach ($results as $result) {
    if (!in_array($result->date, $already_echoed)) { //check if current date is in the already_echoed array
        echo $result->date . "<br />";   
    }
    $already_echoed[] = $result->date; //store all dates in an array to check against.
}

【讨论】:

  • 要么忘记回显日期,要么内爆并回显数组。
  • 题外话,$array[] = $adding_item 是添加到数组的首选方法吗?我总是使用array_push()
  • @tatorface $array[] 首选 - 请参阅参考资料 stackoverflow.com/questions/1074059/…
  • 不要在此处发布代码,而是编辑您的问题 - 在评论中很难理解它。
  • @Dan 谢谢,我在您的链接页面上进行了测试,它 $array[] 是迄今为止更快的工具。感谢您的帮助。
【解决方案2】:
$echoedArray = array();
foreach ($results as $result) {
    if (isset($echoedArray[$result->date])) {
        continue;
    }
    echo $result->date . "<br />";
    $echoedArray[$result->date] = true;
}

【讨论】:

  • 请注意。 in_array 是一个慢得多的函数,而不是按键检查
  • in_array 并没有慢多少。而这个小小的差异并不重要。 3v4l.org/nQZbc
  • 好吧,如果你有几十万个元素就很重要
  • 在 HHVM-3.1 上,in_array() 使用 1000 个元素甚至更快。 (:
【解决方案3】:
    $alreadyOutput = array();
    foreach ($results as $result) {
       if(in_array($result->date, $alreadyOutput)){
           continue;
       }
       $alreadyOutput[] = $result->date; 
       echo $result->date . "<br />";
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多