Home > Software engineering >  How to iterate an array to count elements PHP?
How to iterate an array to count elements PHP?

Time:10-15

I wanna know how to iterate an array to count elements in PHP, I've trying next,

foreach ($items as $item) {
                $tm[$item->provider->name] = [];
                foreach ($items as $item) {
                    $tm[$item->provider->name][$item->product->brand->name] = isset($tm[$item->provider->name][$item->product->brand->name]) ? $tm[$item->provider->name][$item->product->brand->name]   1 : $tm[$item->provider->name][$item->product->brand->name] = 1;
                }
            }

But I get a wrong result, I get an array but I get a very high number count as if iterated many timesmany times

The structure of the array is as follows

[{
    "id": 1,
    "product": {
        "id": 1,
        "brand": {
            "id": 1,
            "name": "iphone"
        }
    },
    "provider": {
        "id": 1,
        "name": "at&t"
    }
},
{
    "id": 2,
    "product": {
        "id": 2,
        "brand": {
            "id": 2,
            "name": "iphone"
        }
    },
    "provider": {
        "id": 1,
        "name": "at&t"
    }
},
{
    "id": 3,
    "product": {
        "id": 3,
        "brand": {
            "id": 3,
            "name": "iphone"
        }
    },
    "provider": {
        "id": 1,
        "name": "t-mobile"
    }
}]

CodePudding user response:

IIUC, you are trying to count the product->brand->name values for each provider->name. You can do that using this code:

$tm = array();
foreach ($items as $item) {
    $product = $item->product->brand->name;
    $provider = $item->provider->name;
    $tm[$provider][$product] = ($tm[$provider][$product] ?? 0)   1;
}

print_r($tm);

Output (for your sample data):

Array
(
    [at&t] => Array
        (
            [iphone] => 2
        )
    [t-mobile] => Array
        (
            [iphone] => 1
        )
)

[Demo on 3v4l.org][3]

CodePudding user response:

From your code example you apparently want to count how many occurrences are for each "thing" in your array, otherwise count() would have probably sufficed...

Though you are doing a lot of work to pre-init the counting array - that is completely unneeded: read about auto-vivifcation.

Code like so would probably suffice (I'm not following your example code here - you'd need to work out to your needs):

$counters = [];
foreach ($items as $item)
  $counters[$item->name][$item->model]  ;
  • Related