How to group items from an array with the same category in PHP

Asked

Viewed 59 times

0

I have a array in PHP that follows the following pattern:

array(3) {
    [0]=> array(3) {
        ["id"]=> string(1) "1"
        ["categoria"]=> string(7) "Celular"
        ["produto"]=> string(8) "Motorola"
    }
    [1]=> array(3) {
        ["id"]=> string(1) "2"
        ["categoria"]=> string(7) "Celular"
        ["produto"]=> string(6) "Iphone"
    }
    [3]=> array(3) {
        ["id"]=> string(1) "3"
        ["categoria"]=> string(9) "Acessório"
        ["produto"]=> string(10) "Carregador"
    }
}

If I do a foreach, they will all come in order, but I would like to group by the item "category", to return the following:

<div>
    <h1>Celular</h1>
    <ul>
        <li>Motorola</li>
        <li>Iphone</li>
    </ul>
</div>
<div>
    <h1>Acessório</h1>
    <ul>
        <li>Carregador</li>
    </ul>
</div>

I tried to make a foreach with if, but as it is a dynamic array, the if doesn’t solve forever

1 answer

1

Hello, you need to sort the array considering the 'category' key. Use the function usort php.

$conjunto[0]['id'] = "1";
$conjunto[0]['categoria'] = "Celular";
$conjunto[0]['produto'] = "Motorola";

$conjunto[1]['id'] = "2";
$conjunto[1]['categoria'] = "Celular";
$conjunto[1]['produto'] = "iPhone";

$conjunto[2]['id'] = "3";
$conjunto[2]['categoria'] = "Acessório";
$conjunto[2]['produto'] = "Carregador";

usort($conjunto, function($a, $b){
    //o segredo está aqui: é feita a comparação de string entre uma linha a próxima (**a** e **b**) 
    return strcmp($a["categoria"], $b["categoria"]);
});

Will sort the array like this:

[0] => Array
    (
        [id] => 3
        [categoria] => Acessório
        [produto] => Carregador
    )

[1] => Array
    (
        [id] => 1
        [categoria] => Celular
        [produto] => Motorola
    )

[2] => Array
    (
        [id] => 2
        [categoria] => Celular
        [produto] => iPhone
    )
)

Browser other questions tagged

You are not signed in. Login or sign up in order to post.