php - Objects Array 获取特定对象并一起显示 PHP
问题描述
我在这里遇到问题,需要一些帮助。
我在我的数据库中保存了一个带有对象的 json_aray 数组。
解码后,print_r
我得到了这个结果。
Array (
[0] => stdClass Object (
[Title] => Image
[Info] => info
[ImageURL] => url.jpg )
[1] => stdClass Object (
[Title] => Image
[Info] => info
[ImageURL] => url.jpg )
[2] => stdClass Object (
[Title] => Accommodation
[Info] => info
[ImageURL] => image.jpg )
[3] => stdClass Object (
[Title] => Accommodation
[Info] => info
[ImageURL] => image.jpg )
[4] => stdClass Object (
[Title] => Accommodation
[Info] => info
[ImageURL] => image.jpg )
[5] => stdClass Object (
[Title] => Image
[Info] => info
[ImageURL] => image.jpg )
[6] => stdClass Object (
[Title] => Location
[Info] => info
[ImageURL] => image.jpg )
)
所以这里是案例:
我正在尝试为每个不同的Object->Title
例如创建一个 div
我试图用foreach
循环检查,但结果是创建了 5 个不同divs
的而不是一个。
php 中是否有任何内置函数来获取所有$obj->Info
if$obj->Title == 'foo'
或以某种方式在foreach
循环之前检查数组具有哪些数据并将它们分开?
我在我的代码中所做的如下
while($row = sqlsrv_fetch_array($get_details)) {
$a = $row['additionalInformation'];
$b = json_decode($a);
$c = $b->AdditonalInfo;
foreach ($c as $d){
echo '<div class="class">';
if(($d->Title !== 'Image')){
echo '<h2>'.$d->Title.'</h2>';
echo '<p>'.$d->Info.'</p>';
}
echo "</div>";
}
}
更新
用实际的代码更改我的代码
这就是我得到的
但是我只需要一次创建该 div 下的Title
所有Info
内容。Title == 'Accommodation'
如果我的问题足够清楚,请告诉我,以便我更新它。
所以总而言之,我需要在一个 div中显示所有[Info]
相同的内容,并为每个唯一的 '[Title]' 创建不同的 div[Title]
提前致谢
解决方案
要求:在连续的记录流中显示“嵌套组”。在这里,我们有一个嵌套组,由一个名为“Title”的字段指示。
必须对输入记录进行排序,以便每组中的所有记录都按要求的顺序排列在一起。
现在,第一个想法是使用“foreach”循环。这不是最清晰的方法,因为您无法通过查看当前记录来检测组的结尾。此外,foreach 循环在循环结束时读取下一条记录。因此,您最终会尝试弄清楚您在小组中的位置以知道该做什么。
我使用一种称为“预读”的技术。这个想法是在循环之前读取一条记录,并在处理完当前记录后立即读取下一条记录。“诀窍”是您在循环内处理组中的所有记录。
所以,逻辑是一个迭代:
- 组的进程开始 - 已经有组的第一条记录 - 重要。
- 处理属于该组的所有详细记录 - 在此循环内读取记录。
- 处理组的末尾 - 当前记录是下一组的第一个
- 重复每组。
它使代码更容易理解。
我已将所有单独的操作拆分为功能,以便您轻松修改各个操作。
请注意,代码与数据的结构相匹配。代码中总是有一个地方可以为该特定数据项放置所需的操作。
eval.in 上的完整工作源代码
运行代码
outputAllGroups($src);
exit();
处理所有组
function outputAllGroups(&$inputList)
{
reset($inputList);
$currentDetails = current($inputList); // read the first record
while ($currentDetails !== false) { // not end of records
// start the title group
$currentTitle = $currentDetails->Title;
outputGroupHeader($currentDetails);
// process all records in the group
while ( $currentDetails !== false
&& $currentDetails->Title === $currentTitle) {
outputDetails($currentDetails);
$currentDetails = readNextDetails($inputList); // may end group
}
// end the title group
outputGroupFooter($currentTitle);
}
}
单个动作的功能
function outputGroupHeader($details)
{
echo '<div class="TitleGroup">'. "<!-- Start Group: {$details->Title} -->". PHP_EOL
. '<div class="Title">'. $details->Title .'</div>' . PHP_EOL;
}
function outputGroupFooter($title)
{
echo '</div>'. "<!-- End Group: {$title} -->". PHP_EOL;
}
function outputDetails($details)
{
echo '<div class="details">'. PHP_EOL,
$details->Info . PHP_EOL,
$details->ImageURL .PHP_EOL,
'</div>' . PHP_EOL;
}
function readNextDetails(&$inputList)
{
$allOk = next($inputList); // advance next
return $allOk !== false ? current($inputList) : $allOk; // advance next
}
输出
<div class="TitleGroup"><!-- Start Group: Image -->
<div class="Title">Image</div>
<div class="details">
info1
url1.jpg
</div>
<div class="details">
info2
url2.jpg
</div>
</div><!-- End Group: Image -->
<div class="TitleGroup"><!-- Start Group: Accommodation -->
<div class="Title">Accommodation</div>
<div class="details">
info3
image3.jpg
</div>
<div class="details">
info4
image4.jpg
</div>
<div class="details">
info5
image5.jpg
</div>
</div><!-- End Group: Accommodation -->
<div class="TitleGroup"><!-- Start Group: Image -->
<div class="Title">Image</div>
<div class="details">
info6
image6.jpg
</div>
</div><!-- End Group: Image -->
<div class="TitleGroup"><!-- Start Group: Location -->
<div class="Title">Location</div>
<div class="details">
info7
image7.jpg
</div>
</div><!-- End Group: Location -->
数据
$src = Array (
'0' => (object) array(
'Title' => 'Image',
'Info' => 'info1',
'ImageURL' => 'url1.jpg', ),
'1' => (object) array(
'Title' => 'Image',
'Info' => 'info2',
'ImageURL' => 'url2.jpg', ),
'2' => (object) array(
'Title' => 'Accommodation',
'Info' => 'info3',
'ImageURL' => 'image3.jpg', ),
'3' => (object) array(
'Title' => 'Accommodation',
'Info' => 'info4',
'ImageURL' => 'image4.jpg', ),
'4' => (object) array(
'Title' => 'Accommodation',
'Info' => 'info5',
'ImageURL' => 'image5.jpg', ),
'5' => (object) array(
'Title' => 'Image',
'Info' => 'info6',
'ImageURL' => 'image6.jpg', ),
'6' => (object) array(
'Title' => 'Location',
'Info' => 'info7',
'ImageURL' => 'image7.jpg', ),
);
推荐阅读
- python - 无法使用 Python 代码访问 NSF 文件 - “注释错误:无法打开 ID 文件”
- android - 无法将元素添加到我从 firebase 获得的 Arraylist
- ios - 我无法在 iOS 14 中为具有 UIDatePickerStyle.inline 的 UIDatePicker 更改文本颜色
- azure-devops - 在 Azure 管道之间传递变量
- python-3.x - 连接来自两个不同来源的两个数据帧。如果数据框丢失,则无法处理情况
- tensorflow - 以最大验证准确度停止训练。这是一个好习惯吗?
- typescript - typescript的Int8ArrayConstructor类型定义可以简化吗
- javascript - Input values not resetting - vuejs
- java - 如何使用 Java 中的另一个对象创建一个对象?
- r - RStudio 中的 SparkR:sparkR.session:JVM 在 10 秒后未准备好