对简单对象进行排序[重复]
Posted
技术标签:
【中文标题】对简单对象进行排序[重复]【英文标题】:Sorting simple Object [duplicate] 【发布时间】: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 【参考方案1】:asort() 适用于关联数组,而不是对象。
您可以通过将其类型转换为描述here,轻松地将您的对象转换为关联数组。
$array = (array) $yourObject;
【讨论】:
没用,但可能是因为我猜它不是一个对象......:x 那是什么?一个JSON?如果是这样,您可以使用 json_decode($json, true);将其转换为关联数组。 我已经编辑了原始问题来解释我是如何构建它的。但如果它确实是一个数组,为什么 sort() 函数不起作用?我的文字字符串在工作时会被删除。但我想保留它们。 您确定在关联数组上使用 asort() 吗?因为它应该完全符合您的要求...这是 PHP 手册:php.net/manual/en/function.asort.php【参考方案2】:你可以使用一个叫做 sort 的 php 函数,试试这样:
$myArray = array(4, 6, 2, 22, 11);
sort($myArray);
结果:2、4、6、11、22
或
$myArray = array(4, 6, 2, 22, 11);
rsort($myArray);
结果:22、11、6、4、2
【讨论】:
我的数组有我想保留的键。以上是关于对简单对象进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章