如何将与 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! ... ";
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! ... ";
$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! ... ";
$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?
我如何才能激活和关联 slideToggle 函数(使用 JavaScript)仅为我试图在 foreach 循环中显示的一部分?