gpt4 book ai didi

php - 如何在 PHP 中编写一个 foreach 循环来计算具有不同元素的 XML 元素的值?

转载 作者:行者123 更新时间:2023-12-01 12:36:30 25 4
gpt4 key购买 nike

我的目标是用 PHP 编写一个可以搜索食物的 foreach 循环 name (即鸡肉馅饼)最低 id menu 中的值(即 5188)并找出食物在一周内供应的次数。例如,代码应按如下方式回显结果:

1. 鸡肉馅饼:3次
2. Tournedos Rossini:1次
3.牛排:1次
4.小酒馆三明治:0次
5.炸鱼薯条:2次

请注意,XML 数据如下所示:

<foods total="5">
<food>
<id>5188</id>
<yourfood>
<name>Chicken Pot Pie</name>
</yourfood>
</food>
<food>
<id>5189</id>
<yourfood>
<name>Tournedos Rossini</name>
</yourfood>
</food>
<food>
<id>5190</id>
<yourfood>
<name>Beefsteak</name>
</yourfood>
</food>
<food>
<id>5191</id>
<yourfood>
<name>Tavern Sandwich</name>
</yourfood>
</food>
<food>
<id>5192</id>
<yourfood>
<name>Fish&amp;Chips</name>
</yourfood>
</food>
</foods>

<weekdays total="7">
<day>
<date>01-16-2016</date>
<menu>We have served Beefsteak for today.</menu>
</day>
<day>
<date>01-17-2016</date>
<menu>We have served Fish&amp;Chips for today.</menu>
</day>
<day>
<date>01-18-2016</date>
<menu>Today, there is Chicken Pot Pie for you.</menu>
</day>
<day>
<date>01-19-2016</date>
<menu>Fish&amp;Chips is one of the best foods in our restaurant</menu>
</day>
<day>
<date>01-20-2016</date>
<menu>Welcome home! Tournedos Rossini!</menu>
</day>
<day>
<date>01-21-2016</date>
<menu>Chicken Pot Pie</menu>
</day>
<day>
<date>01-22-2016</date>
<menu>Chicken Pot Pie is one of our most delicious dishes.</menu>
</day>
</weekdays>

最佳答案

幸运的是,最低的 ID 首先出现,然后完全按照最高的 ID 排列。这是按文档顺序排列的,SimpleXML XPath 是按文档顺序排列的,因此要具有所有名称:

/*/food//name

接下来,您要查看所有工作日菜单描述中该术语的使用频率。对于那些需要从工作日 XML 文档中查看所有这些文本的人:
/*/day/menu

在 PHP 代码中,它很简单:
$foods    = simplexml_load_string($foodsBuffer);
$weekdays = simplexml_load_string($weekdaysBuffer);

$names = $foods->xpath('/*/food//name');
$menus = $weekdays->xpath('/*/day/menu');

现在您关心的是查看每个名称:
foreach ($names as $i => $name) {
...
}

这可能就是您正在寻找的 foreach。但是它还没有完成,您需要检查 $name$menus 条目的一部分的频率。

这是文本比较和 PHP 中的一个库,它适用于文本并与 SimpleXML 中使用的 UTF-8 兼容,是 PCRE 库。

它有一个名为 preg_grep 的方便函数,可以过滤匹配的数组:
$pattern = sprintf('/%s/u', preg_quote($name));
$result = preg_grep($pattern, $menus);

这段代码创建了正则表达式模式并基于它过滤数组。如果 $name 为空,请注意,您将获得所有命中。就是说。

所以完整的 foreach 看起来像:
foreach ($names as $i => $name) {
$pattern = sprintf('/%s/u', preg_quote($name));
$result = preg_grep($pattern, $menus);
printf("%d.) %s: %d time(s)\n", $i + 1, $name, count($result));
}

这是示例输出( online demo ):
1.) Chicken Pot Pie: 3 time(s)
2.) Tournedos Rossini: 1 time(s)
3.) Beefsteak: 1 time(s)
4.) Tavern Sandwich: 0 time(s)
5.) Fish&Chips: 2 time(s)

所以这个答案演示了如何将 PHP 中的多个强大的基石结合在一起:XML 解析器、XPath 查询、数组处理和正则表达式。

以及此答案中完整性的完整示例:
<?php
/**
* How to write a foreach loop in PHP that can count the values of an XML element with a different element?
*
* @link http://stackoverflow.com/a/29219339/367456
*/


$foodsBuffer = <<<XML
<foods total="5">
<food>
<id>5188</id>
<yourfood>
<name>Chicken Pot Pie</name>
</yourfood>
</food>
<food>
<id>5189</id>
<yourfood>
<name>Tournedos Rossini</name>
</yourfood>
</food>
<food>
<id>5190</id>
<yourfood>
<name>Beefsteak</name>
</yourfood>
</food>
<food>
<id>5191</id>
<yourfood>
<name>Tavern Sandwich</name>
</yourfood>
</food>
<food>
<id>5192</id>
<yourfood>
<name>Fish&amp;Chips</name>
</yourfood>
</food>
</foods>
XML;

$weekdaysBuffer = <<<XML
<weekdays total="7">
<day>
<date>01-16-2016</date>
<menu>We have served Beefsteak for today.</menu>
</day>
<day>
<date>01-17-2016</date>
<menu>We have served Fish&amp;Chips for today.</menu>
</day>
<day>
<date>01-18-2016</date>
<menu>Today, there is Chicken Pot Pie for you.</menu>
</day>
<day>
<date>01-19-2016</date>
<menu>Fish&amp;Chips is one of the best foods in our restaurant</menu>
</day>
<day>
<date>01-20-2016</date>
<menu>Welcome home! Tournedos Rossini!</menu>
</day>
<day>
<date>01-21-2016</date>
<menu>Chicken Pot Pie</menu>
</day>
<day>
<date>01-22-2016</date>
<menu>Chicken Pot Pie is one of our most delicious dishes.</menu>
</day>
</weekdays>
XML;


$foods = simplexml_load_string($foodsBuffer);
$weekdays = simplexml_load_string($weekdaysBuffer);

$names = $foods->xpath('/*/food//name');
$menus = $weekdays->xpath('/*/day/menu');

foreach ($names as $i => $name) {
$pattern = sprintf('/%s/u', preg_quote($name));
$result = preg_grep($pattern, $menus);
printf("%d.) %s: %d time(s)\n", $i + 1, $name, count($result));
}

关于php - 如何在 PHP 中编写一个 foreach 循环来计算具有不同元素的 XML 元素的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29212660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com