如何将与 foreach 函数相关的文本放置在循环之外?

Posted

技术标签:

【中文标题】如何将与 foreach 函数相关的文本放置在循环之外?【英文标题】:How can I place text that relates to a foreach function, outside the loop? 【发布时间】:2014-08-25 12:26:53 【问题描述】:

我真的不知道如何描述这个,所以请原谅我。

基本上,我是从 XML 中读取数据,然后生成一个 IF 语句来检查 XML 中的所有记录,如果条件匹配,则会显示有关该记录的详细信息。

我要补充的,是一个类似的函数,但是是反向的,但是在foreach循环之外,所以只显示一次。

foreach($xml as $Reader)  $items[] = $Reader; 
$items= array_filter($items, function($Reader) use ($exclude) 
    if($Reader->Picture == 'None' || in_array($Reader->Pin, $exclude))  
        return false;
       
        return true;
);
usort ($items, function($a, $b)  
    return strcmp($a->Status,$b->Status); 
);
foreach($items as $Reader) 
    if($Reader->Status == 'Available' && !in_array($Reader->Pin, $exclude)) 
        echo "<a href='/details?Pin=".$Reader->Pin."'>".$Reader->Name ." (".$Reader->Pin.")</a> is available! ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
    

if (!$items)  echo "Please check back in a moment when our readers will be available!"; 

因此,在 XML 文件中,每个阅读器的状态可以是以下三个值之一:可用、忙碌或已注销。

所以我正在做的是针对 XML 中的每条记录,检查 Reader 状态是否可用.. 如果是,则回显上述行。

但我想补充一点,如果没有读者显示为“可用”,则回显一行“请稍后再回来查看”。

使用上面的代码,如果有四个阅读器在线,但他们都在忙.. 没有任何显示。

有什么想法吗?

【问题讨论】:

我不太确定你想做什么,但是在 foreach 中你可以使用引用,所以 foreach($items as &$reader),也许这就是你要找的?跨度> 我想要达到的目的是不要将它包含在 foreach 循环中,这是 else 会做的。 XML 文件中大约有 80 个阅读器,我只希望消息出现一次 【参考方案1】:

只需使用一个简单的布尔值

$noneAvailable = true;
foreach($items as $Reader) 
    if($Reader->Status == 'Available' && !in_array($Reader->Pin, $exclude)) 
        echo "<a href='/details?Pin=".$Reader->Pin."'>".$Reader->Name ." (".$Reader->Pin.")</a> is available! ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
        $noneAvailable = false;
    


if ($noneAvailable) 
  echo "Please check back in a moment";

【讨论】:

当有些读者可用,有些读者很忙时,这会变得混乱..它会打印可用的,然后显示消息 我不是 php 专家,但如果打印了可用的,则意味着 $noneAvailable 设置为 false。这意味着,下面的if 为假,不会执行回显。 我以此为基础生成了我自己的。所以将其标记为答案 这两者肯定都做了,反正现在已经排序了。我将添加我实际使用的代码,这会有所帮助【参考方案2】:

我设法接受了上面给出的答案,并将其与 XPath 结合起来,根据使用 xPath 给出的状态过滤 XML 中的记录。

include TEMPLATEPATH."/extras/get-readers.php";
$readers = $xml->xpath('/ReaderDetails/Reader[Status="Available"]');
$gotOps = false;
foreach ($readers as $Reader)
    
        echo "<a href='/details?Pin=".$Reader->Pin."'>".$Reader->Name ." (".$Reader->Pin.")</a> is available! ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
        $gotOps = true;
    
if ($gotOps!=true)
    
        echo 'Please check back in a moment when our readers will be available!';
    

【讨论】:

在这种情况下,您可以跳过$gotOps 并简单地检查!count($readers),即检查数组是否为非空。此外,$gotOps!=true 始终使用 !$gotOps,而不是 !$gotOps,它更短且更标准。

以上是关于如何将与 foreach 函数相关的文本放置在循环之外?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 的 foreach 循环中优化大型 mySQL?

如何在 C# 中连接由 foreach 循环大写的文本?

我如何才能激活和关联 slideToggle 函数(使用 JavaScript)仅为我试图在 foreach 循环中显示的一部分?

如何在 mvc 中使用 foreach 循环验证多个文本框?

如何限制与存储的数据库条目相关的@foreach 循环?

如何将 string.join 添加到 foreach 循环