我试图从下面的数组中生成一个按"groupName"分组的HTML列表。
array (size=30)
0 =>
array (size=4)
'groupOrder' => string '1' (length=1)
'groupName' => string 'Class' (length=11)
'txt' => string '............' (length=32)
'ID' => string '6' (length=1)
1 =>
array (size=4)
'groupOrder' => string '1' (length=1)
'groupName' => string 'Size' (length=11)
'txt' => string '..................' (length=34)
'ID' => string '6' (length=1)
2 =>
...
所以我想生成这样的伪列表:
- groupName
- txt
- txt
- txt
下GroupName - txt
- 三种…
我的代码是这样的
foreach ($datafeed as $val => $row) {
if (($datafeed[$val]['groupName']) == next($datafeed[$val]['groupName'])) {
//same group - do nothing
} else {
echo $datafeed[$val]['groupName'];
}
echo "<li>".$row['txt']. "</li>";
}
但是我得到关于"next()期望参数1是数组,字符串给定"的错误。
我已经尝试了各种不同的语法,但我没有取得多大进展。如何比较嵌套数组中的两个值?
您误解了函数next()
的含义:您不能为数组元素查询它。它操作与数组本身绑定在一起的内部数组指针,而不是与数组的某些元素绑定在一起。来自PHP文档:
Every array has an internal pointer to its "current" element, which is initialized to the first element inserted into the array.
,参见next
的描述。
由于foreach
循环至关重要地依赖于数组指针的值,打乱数组指针将破坏循环:您可能会看到循环中的每第二个元素,因为在每次迭代中,next()
被您的foreach
循环调用,然后由您自己调用一次。
对您来说最简单的事情可能是使用旧的好的for
循环:
for ($i = 0; $i < length ($array); $i++)
{
if ($i == 0 || $array[$i] != $array[$i - 1])
echo "New group!n";
echo $array[$i];
}
这并不能直接回答你的问题,但是你最好重组你的数组,这样它们就分组了,你不需要在循环中执行任何逻辑来检查groupName
。目前,您依赖于下一个groupName
来匹配当前的groupName
,但如果它们不是连续的,它们将不会被分组。
你可以这样做:
$output = array();
foreach ($datafeed as $feed) {
$output[$feed['groupName']][] = $feed;
}
这是一个演示
无论如何你都不应该在foreach
循环中使用next
,因为你会得到冲突的数组指针移动。只需存储最后一个值:
$last = null;
foreach (...) {
if ($last != $row['current']) {
// new group
}
$last = $row['current'];
...
}