tipos - php length array
Contar las apariciones de un valor en una columna de una matriz de matrices de objetos (4)
Intenta con:
$input = array( /* your data */ );
$count = 0;
foreach ( $input as $value ) {
if ( $value->type == ''photo'' ) {
$count++;
}
}
Alguien sabe cómo contar las apariciones de "foto" en esta matriz:
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 ) )
Me gustaría reconocer que el método de Dor Shemer es (IMO) el método más directo, limpio, legible y confiable. Solo quiero ofrecer algunas alternativas para aquellos que prefieren usar la programación funcional ... array_reduce()
es un segundo para mí. Finalmente, quiero identificar un pequeño Gotcha para los métodos que usan array_count_values()
- por favor lea en ...
Batería de Métodos: ( Demo )
$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''];
Entrada / Salida usando datos de muestra de OP (sin problemas):
$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
Entrada / Salida usando datos sin valores de photo
(problema con el array_count_values()
2nd array_count_values()
):
$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()
no se molesta en generar elementos con un recuento de 0
.
Para contar la ocurrencia coincidente de una cadena en una matriz multidimensional, deberá iterar sobre cada elemento de la matriz y coincidir con la cadena e incrementar el conteo. Al igual que @Dor ha sugerido.
$count = 0;
foreach ($array as $item) {
if ($item->type === ''photo'') {
$count++;
}
}
Si quieres lograr lo mismo en una matriz unidimensional, entonces es bastante sencillo. Puede usar la función de matriz PHP array_count_values como se explica a continuación.
<?php
$array = array(1, "test", 1, "php", "test");
print_r(array_count_values($array));
?>
El ejemplo anterior dará como resultado:
Array
(
[1] => 2
[test] => 2
[php] => 1
)
$count = 0;
foreach ($array as $item) {
if ($item->type === ''photo'') {
$count++;
}
}