0

我有一个如下所示的数组

Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [cat_id] => 1
            [item_name]=>test1
            [cat_name] => Normal
        )

    [1] => stdClass Object
        (
            [id] => 2
            [cat_id] => 2
            [item_name]=>test2
            [cat_name] => Featured
        )

    [2] => stdClass Object
        (
            [id] => 3
            [cat_id] => 2
            [item_name]=>test3
            [cat_name] => Featured
        )  
)  

我希望结果看起来像这样

普通的

test1

精选

test2  |  test3

到目前为止,我已经尝试过:

<?php
foreach($rows as $row){
    echo '<h2>'.$row->cat_name.'</h2>';
    echo '<p>'.$row->item_name.'</p>';
}
?>

但它显示了每个项目的标题。有人可以帮我解决这个问题。

谢谢

4

1 回答 1

2

所以你想把它们分组?这是一个功能:

function groupBy($arr, $func) {
    $groups = [];

    foreach($arr as $item) {
        $group = $func($item);

        if(array_key_exists($group, $groups))
            $groups[$group][] = $item;
        else
            $groups[$group] = [$item];
    }

    return $groups;
}

像这样使用它:

$groups = groupBy($rows, function($row) { return $row->cat_name; });

foreach($groups as $name => $items) {
    echo "<h2>$name</h2>";

    foreach($items as $item)
        echo "<p>{$item->item_name}</p>";
}

这是一个演示。如果你没有 PHP 5.3 的奢侈,那么你可以让它更专业:

function groupBy($arr, $prop) {
    $groups = array();

    foreach($arr as $item) {
        $group = $item->$prop;

        if(array_key_exists($group, $groups))
            $groups[$group][] = $item;
        else
            $groups[$group] = array($item);
    }

    return $groups;
}
...
$groups = groupBy($rows, 'cat_name');

foreach($groups as $name => $items) {
    echo "<h2>$name</h2>";

    foreach($items as $item)
        echo "<p>{$item->item_name}</p>";
}

PHP 5.2.17 演示

于 2013-01-19T19:46:37.897 回答