web-dev-qa-db-fra.com

Compter les occurrences d'une valeur dans une colonne d'une matrice de tableaux d'objet

Est-ce que quelqu'un sait comment compter les occurrences de "photo" dans ce tableau:

    Array ( 
    [0] => stdClass Object ( [type] => photo [id] => 1404781893036 [created_time] => 2012-03-02T07:58:23+0000 ) 
    [1] => stdClass Object ( [type] => photo [id] => 14047818930362 [created_time] => 2012-03-01T14:58:53+0000 ) 
    [2] => stdClass Object ( [type] => status [id] => 1404781893036 [created_time] => 2012-03-01T09:49:40+0000 ) 
    [3] => stdClass Object ( [type] => status [id] => 14047818930362 [created_time] => 2012-03-01T09:36:04+0000 ) 
    [4] => stdClass Object ( [type] => photo [id] => 14047818930362 [created_time] => 2012-02-28T07:03:25+0000 ) 
    [5] => stdClass Object ( [type] => photo [id] => 1404781893036 [created_time] => 2012-02-27T09:15:34+0000 ) 
    [6] => stdClass Object ( [type] => photo [id] => 14047818930362 [created_time] => 2012-02-27T07:32:13+0000 ) 
    [7] => stdClass Object ( [type] => status [id] => 1404781893036 [created_time] => 2012-02-25T09:36:57+0000 )
    [8] => stdClass Object ( [type] => photo [id] => 1404781893036 [created_time] => 2012-02-23T08:46:43+0000 ) 
    [9] => stdClass Object ( [type] => status [id] => 1404781893036 [created_time] => 2012-02-22T21:04:30+0000 ) 
    [10] => stdClass Object ( [type] => status [id] => 1404781893036 [created_time] => 2012-02-21T20:38:27+0000 )
    [11] => stdClass Object ( [type] => photo [id] => 1404781893036 [created_time] => 2012-02-21T07:22:44+0000 ) 
    [12] => stdClass Object ( [type] => status [id] => 14047818930362 [created_time] => 2012-02-20T08:32:46+0000 ) 
    [13] => stdClass Object ( [type] => status [id] => 1404781893036 [created_time] => 2012-02-17T15:00:11+0000 ) )
20
G.W
$count = 0;
foreach ($array as $item) {
  if ($item->type === 'photo') {
    $count++;
  }
}
15
Dor Shemer

Pour compter l'occurrence de correspondance d'une chaîne dans une matrice multidimensionnelle, vous devrez itérer sur chaque élément de tableau et correspond à la chaîne et incrémentez le nombre. Similiarly @dor a suggéré

$count = 0;
foreach ($array as $item) {
  if ($item->type === 'photo') {
    $count++;
  }
}

Si vous voulez obtenir la même chose dans une matrice dimensionnelle, il est assez simple. Vous pouvez utiliser array_count_values PHP Fonction de tableau comme expliqué ci-dessous.

<?php
   $array = array(1, "test", 1, "php", "test");
   print_r(array_count_values($array));
?>

L'exemple ci-dessus sortira:

Array
(
    [1] => 2
    [test] => 2
    [php] => 1
)
56
Roopendra

J'aimerais reconnaître que la méthode de Dor Shemer est (IMO) la méthode la plus directe, propre, lisible et fiable. Je veux juste offrir quelques alternatives pour ceux qui préfèrent utiliser la programmation fonctionnelle ...array_reduce() est une seconde de près pour moi. Enfin, je veux identifier un petit gotcha pour des méthodes utilisant array_count_values() - Veuillez lire sur ...

Batterie de méthodes: ( démo )

$photo_count=0;  // establish default value
foreach($array as $objects){
    if($objects->type==='photo') ++$photo_count;  // pre-increment
}
echo "foreach result = $photo_count";

echo "array_reduce = ",array_reduce($array,function($carry,$objects){return $carry+($objects->type==='photo'?1:0);},0);

echo "array_filter & count = ",sizeof(array_filter($array,function($objects){return $objects->type==='photo';}));

echo "array_column & array_filter & count = ",sizeof(array_filter(array_column($array,'type'),function($v){return $v==='photo';}));

echo "array_map & array_count_values & array_replace = ",array_replace(['photo'=>0],array_count_values(array_map(function($o) {return $o->type;}, $array)))['photo'];

echo "array_map & array_count_values (gives Notice) = ",array_count_values(array_map(function($o) {return $o->type;}, $array))['photo'];

Entrée/sortie à l'aide des données d'échantillons d'OP (aucun problème):

$array=[
    (object)['type'=>'photo','id'=>1404781893036,'created_time'=>'2012-03-02T07:58:23+0000'],
    (object)['type'=>'photo','id'=>14047818930362,'created_time'=>'2012-03-01T14:58:53+0000'],
    (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-03-01T09:49:40+0000'],
    (object)['type'=>'status','id'=>14047818930362,'created_time'=>'2012-03-01T09:36:04+0000'],
    (object)['type'=>'photo','id'=>14047818930362,'created_time'=>'2012-02-28T07:03:25+0000'],
    (object)['type'=>'photo','id'=>1404781893036,'created_time'=>'2012-02-27T09:15:34+0000'],
    (object)['type'=>'photo','id'=>14047818930362,'created_time'=>'2012-02-27T07:32:13+0000'],
    (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-02-25T09:36:57+0000'],
    (object)['type'=>'photo','id'=>1404781893036,'created_time'=>'2012-02-23T08:46:43+0000'],
    (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-02-22T21:04:30+0000'],
    (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-02-21T20:38:27+0000'],
    (object)['type'=>'photo','id'=>1404781893036,'created_time'=>'2012-02-21T07:22:44+0000'],
    (object)['type'=>'status','id'=>14047818930362,'created_time'=>'2012-02-20T08:32:46+0000'],
    (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-02-17T15:00:11+0000']
];

// output:
foreach result = 7

array_reduce = 7

array_filter & count = 7

array_column & array_filter & count = 7

array_map & array_count_values & array_replace = 7

array_map & array_count_values = 7

Entrée/sortie à l'aide de données sans photo valeurs (problème avec 2ND array_count_values() Méthode):

$array=[
    (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-03-01T09:49:40+0000'],
    (object)['type'=>'status','id'=>14047818930362,'created_time'=>'2012-03-01T09:36:04+0000'],
    (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-02-25T09:36:57+0000'],
    (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-02-22T21:04:30+0000'],
    (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-02-21T20:38:27+0000'],
    (object)['type'=>'status','id'=>14047818930362,'created_time'=>'2012-02-20T08:32:46+0000'],
    (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-02-17T15:00:11+0000']
];
// or if there are no object rows like: $array=[];
// output:
foreach result = 0

array_reduce = 0

array_filter & count = 0

array_column & array_filter & count = 0

array_map & array_count_values & array_replace = 0

array_map & array_count_values (gives Notice) = <br />
<b>Notice</b>:  Undefined index: photo in <b>[...][...]</b> on line <b>43</b><br />

array_count_values() ne prend pas la peine de générer des éléments avec un compte 0.

2
mickmackusa

Essayez avec:

$input = array( /* your data */ );
$count = 0;
foreach ( $input as $value ) {
  if ( $value->type == 'photo' ) {
    $count++;
  }
}
1
hsz