【发布时间】:2022-01-10 03:53:56
【问题描述】:
基材:
我有一个基本列表$food:
[{"id":"123","name":"apple"},{"id":"456","name":"Rost Beef"},...]
我首先用$food_reduced = array_count_values(array_columns($food, "id")); 减少。
[{123:2},{456:5},...]
然后我通过$food_reduced 和foreach($food_reduced as $id => $count) 循环查询数据库以获取类别(蔬菜、水果、肉类、鱼类等)我存储到循环之前声明的$food_byCategory = array();:
if ($food_byCategory[$row["ctg_name"]])
{
$food_byCategory[$row["ctg_name"]] += $count;
}
else
{
$food_byCategory[$row["ctg_name"]] = $count;
}
这给了我这个我想在 PHP 中排序的数组(gettype() 说它至少是一个数组):
{
Vegetable: 2
Fruit: 1
Fish: 5
Drinks: 1
Meat: 2
Desert: 3
}
到这里:
{
Fish: 5
Desert: 3
Meat: 2
Vegetable: 2
Drinks: 1
Fruit: 1
}
注意key 排序完成后,value 排序。
然后目标是按值降序将此列表显示为 html 列表。
我试过asort、sort、arsort,有或没有选项SORT_NUMERIC等...
无论它根本不工作,还是它正在擦除密钥并用索引替换它们。
我也尝试过将它类型转换为数组,但没有任何改变(可能是因为它已经是数组?但是,不是对象?)
我有点迷路了。 帮忙?
解决了我的问题,通过另一种方式构建“count”数组:
if (!in_array($ctg_id, array_column($food_byCategory, "id")))
{
$food_byCategory[] = array(
"id" => $ctg_id,
"count" => 1
);
}
else
{
$index = array_search($ctg_id, array_column($food_byCategory, "id"));
$food_byCategory[$index]["count"]++;
}
然后用usort对其进行排序:
usort($food_byCategory, function($a, $b) {
return $b["count"] <=> $a["count"];
});
【问题讨论】:
-
对象的属性排序没用。
-
没用还是不可能?
-
我会说两个。
-
现在,如果它实际上不是一个对象,而是一个关联数组,那么它既可能而且可能有用。
-
其实 gettype() 说它是一个数组.. :x