我有包含一些值的数组数据。我想要计算特定的关键值。
我的数组:
Array
(
[0] => stdClass Object
(
[id] => 3
[product_id] => 42
[user_id] => 69
[order_item_id] => 0
[sku_id] => 78
[rate] => 4 // count
[description] => Wonderful dress.
[is_certifiedbuyer] => 1
[status] => 1
[deleted] => 0
[created_at] => 2016-03-11 16:53:31
[updated_at] => 2016-03-11 16:53:31
[username] => Hiral
[productname] => Aish dress
)
[1] => stdClass Object
(
[id] => 4
[product_id] => 42
[user_id] => 12
[order_item_id] => 0
[sku_id] => 78
[rate] => 2
[description] => Greate dress.
[is_certifiedbuyer] => 1
[status] => 1
[deleted] => 0
[created_at] => 2016-03-11 16:53:31
[updated_at] => 2016-03-11 16:53:31
[username] => Admin
[productname] => Aish dress
)
)
从上面的阵列我想要计算总共5个评级用户,总共4个评级用户,总共3个评级等等
简而言之,我想从上面的数组计算费率字段。
我尝试过:
$reviews=$this->ProductReviewRepo->ProductReview(42);
$div1 = array_filter($reviews, function($review) {
return substr('4', $review->rate) !== false;
});
echo '<pre>';print_r(count($div1));
$div2 = array_filter($reviews, function($review) {
return substr('4', $review->rate) !== false;
});
echo '<pre>';print_r(count($div2));
$div3 = array_filter($reviews, function($review) {
return substr('3', $review->rate) !== false;
});
echo '<pre>';print_r(count($div3));
$div4 = array_filter($reviews, function($review) {
return substr('2', $review->rate) !== false;
});
echo '<pre>';print_r(count($div4));
$div5 = array_filter($reviews, function($review) {
return substr('1', $review->rate) !== false;
});
但是我得到的错误只能计算字符串和整数值。
答案 0 :(得分:2)
转换你的对象在数组中,你可以使用它:
$arr = array(array('rate'=>4,'id1'=>2),array('rate'=>4,'id1'=>4),
array('rate'=>3,'id1'=>44));
$ids = array_map(function ($ar) {return $ar['rate'];}, $arr);
$count_array = array_count_values($ids);
print_r($count_array);
结果:
Array ( [4] => 2 [3] => 1 )
这表示您有2个评级为4的用户和1个评级为3的用户。
答案 1 :(得分:1)
我认为这会给你带来更好的表现。在循环之前声明变量$count1
,$count2
....然后根据评级值继续增加相应的变量。我正在使用$value->rate
,因为它们是数组中的对象。
foreach ($myArray as $key => $value) {
switch ($value->rate) {
case '1':
$count1++;
break;
case '2':
$count2++;
break;
case '3':
$count3++;
break;
case '4':
$count4++;
break;
case '5':
$count5++;
break;
default:
break;
}
}
为什么表现更好
使用array_filter
时,它会遍历数组。因此,当您使用多个array_filter
时,您将循环多次。但是,通过这种方法,您只需在阵列上进行一次循环就可以完成它。
答案 2 :(得分:0)
你可以通过使用额外的数组来计算array_filter,如下所示。但是你需要设置&amp;获取更新$ count。
$count = array(1=>0,2=>0,3=>0,4=>0,5=>0);
array_filter($json, function($review) use (&$count) {
if($review->rate == 1){
$count[1] = $count[1]+1;
}
else if($review->rate == 2){
$count[2] = $count[2]+1;
}
else if($review->rate == 3){
$count[3] = $count[3]+1;
}
else if($review->rate == 4){
$count[4] = $count[4]+1;
}
else if($review->rate == 5){
$count[5] = $count[5]+1;
}
});
var_dump($count);