我有一个id列表[1,500,7]和一个具有相应id属性的实体列表,但顺序不同(1 - > 7,500)。在php中,我如何根据id列表对它们进行排序?
Php版本是5.3.2
答案 0 :(得分:4)
给出一些如下所示的数据结构(来自您的描述):
$ids = array(5, 15, 10);
$values = array(
(object) array('id' => 10, 'data' => 'foo'),
(object) array('id' => 5, 'data' => 'foo'),
(object) array('id' => 15, 'data' => 'foo'),
);
您可以使用以下内容:
// Precalculate sort positions to avoid two calls to array_search for each sort
// operation as that gets costly very quickly.
$id_positions = array_flip($ids);
// Do the actual sorting here.
usort($values, function($a, $b) use ($id_positions) {
return ($id_positions[$a->id] < $id_positions[$b->id] ? -1 : 1);
});
上面的代码做了一些假设,但应该让你上路。
答案 1 :(得分:0)
您可以创建一个比较函数(或类中的方法),该函数应返回正数,负数或0值,具体取决于要比较的第一个值是大于,小于还是等于第二个值。然后拨打usort()(在此链接中,您将找到有关比较功能的更多信息)。
答案 2 :(得分:0)
假设ID列表和实体列表长度相同,并且每个ID都有相应的实体,并且每个实体的ID都在ID列表中。
$sorted_entities = array();
$sort_order = array_combine($list_of_ids, range(0, count($list_of_ids) - 1));
foreach ($list_of_entities as $entity) {
$sorted_entities[$sort_order[$entity->id]] = $entity;
}
这样做的好处是只遍历每个数组一次。它的缺点是它不对实体进行排序。