【问题标题】:php if foreach statement works, but else message not displayingphp if foreach 语句有效,但其他消息不显示
【发布时间】:2012-05-21 01:07:07
【问题描述】:

我正在从我的模型中获取一组数据,并使用 php foreach 语句将其显示在视图中。我正在添加另一层逻辑以仅显示某些书签 ID。

数据显示正常;但由于某种原因,“else”消息(与第一个 if 子句相关)没有显示是否没有返回数据。我需要弄清楚如何显示该消息。

<?php 

     if ($bookmark): 
     foreach($bookmark as $b): ?>               

     <?php if ($b->bookmark_id != 0) { ?>               

     <li><?php echo $bk->user_id; ?> <?php echo $bk->bookmark_name; ?></li>

     <?php } ?>


     <?php
      endforeach;
        else:
          print "Your bookmark list is empty.";
    endif;

?>

【问题讨论】:

  • If-else 条件错误.. 另外 php 中没有什么叫 endforeach
  • 您的$bookmark 可能不为空,这就是else 不触发的原因 - 当您知道没有结果时尝试在第一个if 中回显它
  • @J A,PHP 为其某些控制结构提供了另一种语法;即 if、while、for、foreach 和 switch。在每种情况下,替代语法的基本形式是将左大括号更改为冒号 (:),将右大括号更改为 endif;、endwhile;、endfor;、endforeach; 或 endswitch;。 Read Here!
  • @Zuul:哇,不知道 php 中的这个特性。。点了。谢谢。
  • @ZoltanToth 我已经回应了它,但没有任何结果,但仍然没有收到 else 消息。关于为什么 else 可能不起作用的任何其他想法?

标签: php if-statement foreach


【解决方案1】:
if (is_array($bookmark) && !empty($bookmark)) { 
  foreach ($bookmark as $item) {               
   ...
  }
} else {
  echo "Your bookmark list is empty.";
}

【讨论】:

  • 这并不能真正回答问题。您应该用 OP 的代码解释问题。
【解决方案2】:

你测试 $bookmark 是否存在!我假设它总是存在的,要么是空的,要么是值数组!

试试这个:

<?php 

if (is_array($bookmark) && count($bookmark)>=1): 
  foreach($bookmark as $b): ?>               

  <?php if ($b->bookmark_id != 0) { ?>               

    <li><?php echo $bk->bookmark_name; ?></li>

  <?php } ?>


  <?php
  endforeach;
else:
  print "Your bookmark list is empty.";
endif;

?>

阅读:PHP is_array() | count()

已编辑

与最近发表的评论有关 “是的,数组正在返回结果;我正在使用第二个 if 语句来限制显示的内容。听起来我的 else 语句应该绑定到第二个 if 子句,而不是第一个。对我来说,问题不在于是否有结果;而是在过滤结果后是否还有任何东西。":

<?php 

// reset variable
$count = 0;

// if it is an array and is not empty
if (is_array($bookmark) && count($bookmark)>=1): 
  foreach($bookmark as $b):
    if ($b->bookmark_id != 0) {               
      echo '<li>' . $bk->bookmark_name . '</li>';
    } else {
      $count++; // no data, increase
    }

    // check if the counter was increased 
    if ($count>=1) {
      print "Your bookmark list is empty.";
    }
  endforeach;
else:
  print "bookmark not found.";
endif;

?>

【讨论】:

  • 不,他正在测试$bookmark 的计算结果是否为真。它可以设置为false0""array() 等,并且仍然执行else 块。如果$bookmark 是一个对象,正如我所怀疑的那样,您的代码实际上不会输出任何内容,因为is_array(new ArrayObject) 返回false。
  • 在一分钟前编辑添加 count() ;)
  • 谢谢。我现在要测试一下,很快就会回来。
  • 试过了,仍然没有触发 else 子句。
  • 请在if 子句之前执行var_dump($bookmark); 并将该输出放在问题上!
【解决方案3】:

出于某种原因,$bookmark 的评估结果为真。由于空字符串和数组在 PHP 中已经被评估为 false,我们可以合理地假设 $bookmark 实际上是一个对象。因为我们可以用foreach 对其进行迭代,所以它可能是ArrayObject 的一个实例,或者是一个扩展它的类。我们可以通过编写来调试$bookmark 的确切类型:

var_dump($bookmark);

由于空对象实例在 PHP 条件中的计算结果为 true,因此我们需要更具体地了解我们正在检查的内容。

if(count($bookmark) &gt; 0):

这应该会正确触发 else 条件。作为旁注,您应该真正正确地缩进您的代码。 :)

【讨论】:

  • 谢谢你;将很快对其进行测试。我正确缩进代码;当我将它复制到 SO 上时,它似乎永远不会正确粘贴。 :S
  • 显然empty() 在空的ArrayObject 上实际上不起作用——编辑为使用更可靠的count()
  • 好的,谢谢。我测试了 count 功能,但仍然没有显示 else 条件。旁注:之前我拼错了一个变量并得到了一个错误; else 子句显示在错误下方。
  • 好的,var_dump 有问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 2018-10-02
相关资源
最近更新 更多