列出多维数组中所有类别的帖子

时间:2017-12-13 00:07:22

标签: php multidimensional-array

我想列出各种类别下的所有帖子 我有这样的多维数组:

$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

不是我想要的。

3 个答案:

答案 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

或使用RecursiveIteratorIterator

$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语句,这并不快,但它应该可以满足您的需求。