我想列出各种类别下的所有帖子 我有这样的多维数组:
$categories = [
['category_name' => 'Book Category', 'post_title' => 'book 1'],
['category_name' => 'Book Category', 'post_title' => 'book 2'],
['category_name' => 'Shoe Category', 'post_title' => 'shoe 1'],
['category_name' => 'Shoe Category', 'post_title' => 'shoe 2'],
]
我想在同一页面上列出类别和帖子标题:
图书类别:
第1册
第2册
鞋类
鞋1
鞋2
这里有很多类似的帖子,但它们对于各种PHP框架来说太具体了,这对我的Core PHP案例没有帮助。我试过这个
foreach ($categories as $category) {
echo $category['category_name"] . "<br>";
echo $category['post_title"] . "<br>";
}
但我得到的是这样的东西:
图书类别
第1册
图书类别
第2册
鞋类
鞋1
鞋类
鞋2
不是我想要的。
答案 0 :(得分:2)
这个怎么样?
$printable_arr = [];
foreach($categories as $category) {
$printable_arr[$category['category_name']][] = $category['post_title'];
}
// Now the array $printable_arr will have the items categorised. You can use the php functions to manipulate the array, or print the results as needed.
// For example:
foreach ($printable_arr as $category => $item)
{
echo "<h1>$category</h1><br/>";
echo implode("<br/>",$item);
}
答案 1 :(得分:1)
您可以先使用array_reduce
构建嵌套数组,然后根据需要显示它:
$nested = array_reduce($categories, function ($carry, $item) {
$carry[$item['category_name']][] = $item['post_title'];
return $carry;
}, []);
然后您可以使用嵌套的foreach
:
foreach ($nested as $category => $titles) {
echo "$category:\n";
foreach ($titles as $title) {
echo "\t$title\n";
}
}
这是demo。
$iterator = new RecursiveIteratorIterator(
new RecursiveArrayIterator($nested),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $key => $value) {
if ($iterator->getDepth() == 0) {
echo "{$key}:\n";
} else {
echo "\t$value\n";
}
}
这是demo。
答案 2 :(得分:1)
这应该将您的数组重新排列为$ category_array = ['category_name1'=&gt; array ['title1','title2'],'category_name2'=&gt; array ['title1','title2']]
foreach ($categories as $category) {
$category_array[$category['category_name']][] = $category['post_title'];
}
这将检查是否已打印类别名称并打印与category_name
关联的值数组$old_key = null;
foreach ($category_array as $key=>$value) {
if ($key !== $old_key) {
echo $key . '<br>';
$old_key = $key;
}
if ($key === $old_key) {
foreach ($value as $v) {
echo $v . '<br>';
}
}
}
由于所有嵌套的foreach和if语句,这并不快,但它应该可以满足您的需求。