如何对php对象进行自定义排序(优雅)?

如何对php对象进行自定义排序(优雅)?,php,Php,我有一个id列表[1500,7]和一个具有相应id属性的实体列表,但顺序不同(1->7500)。在php中,如何根据ID列表对它们进行排序 Php版本为5.3.2您可以创建一个比较函数(或类内的方法),该函数应返回一个正值、负值或0值,具体取决于要比较的第一个值是否大于、小于或等于第二个值。然后调用(在此链接中,您将找到有关比较函数的更多信息)。您可以创建一个比较函数(或类内的方法),该函数应返回一个正值、负值或0值,具体取决于要比较的第一个值是否大于、小于或等于第二个值。然后调用(在此链接中,

我有一个id列表[1500,7]和一个具有相应id属性的实体列表,但顺序不同(1->7500)。在php中,如何根据ID列表对它们进行排序


Php版本为5.3.2

您可以创建一个比较函数(或类内的方法),该函数应返回一个正值、负值或0值,具体取决于要比较的第一个值是否大于、小于或等于第二个值。然后调用(在此链接中,您将找到有关比较函数的更多信息)。

您可以创建一个比较函数(或类内的方法),该函数应返回一个正值、负值或0值,具体取决于要比较的第一个值是否大于、小于或等于第二个值。然后调用(在此链接中,您将找到有关比较函数的更多信息)。

给定一些数据结构,如以下所示(根据您的描述):

您可以使用以下内容:

// 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);
});
//预先计算排序位置以避免对数组的两次调用\u搜索每个排序
//这样的操作很快就会变得昂贵。
$id\u positions=array\u flip($id);
//在这里进行实际排序。
usort($value,function($a,$b)use($id\u位置){
返回($id\u positions[$a->id]<$id\u positions[$b->id]?-1:1);
});

上面的代码做了一些假设,但应该可以帮助您解决问题。

给出了如下数据结构(根据您的描述):

您可以使用以下内容:

// 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);
});
//预先计算排序位置以避免对数组的两次调用\u搜索每个排序
//这样的操作很快就会变得昂贵。
$id\u positions=array\u flip($id);
//在这里进行实际排序。
usort($value,function($a,$b)use($id\u位置){
返回($id\u positions[$a->id]<$id\u positions[$b->id]?-1:1);
});

上面的代码做了一些假设,但应该会让您上路。

假设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;
}

这样做的优点是只遍历每个数组一次。它的缺点是没有对实体进行适当排序。

假设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;
}


这样做的优点是只遍历每个数组一次。它的缺点是没有对实体进行适当的排序。

您能给我们一个实际数据的样本吗?如果您不共享这些实体的列表,我们如何帮助您?如果您希望我们提供帮助,请讲道理,共享一些我们可以查看和使用的代码。您能给我们一个实际数据的示例吗?如果您不共享这些实体的列表,我们如何帮助您?如果你想让我们帮忙,请讲道理,分享一些我们可以查看和使用的代码。嗯,这很不令人满意。我宁愿映射id,并将正确的id作为值附加到对象。但是,对于php来说,这可能是一种功能性太强的方法…@Jan:php才刚刚开始推进编程的功能性方面。例如,我们在5.3中只得到闭包。许多函数都是冗长的,试图将它们链接起来是一件痛苦的事情(您必须反向操作,因为没有对象,只有函数调用)。总而言之,PHP不太适合函数式编程(至少,我对PHP6+).Hm抱有希望,这很不令人满意。我宁愿映射id,并将正确的id作为值附加到对象。但是,对于php来说,这可能是一种功能性太强的方法…@Jan:php才刚刚开始推进编程的功能性方面。例如,我们在5.3中只得到闭包。许多函数都是冗长的,试图将它们链接起来是一件痛苦的事情(您必须反向操作,因为没有对象,只有函数调用)。总而言之,PHP不太适合函数式编程(至少现在是这样。我对PHP6+抱有希望。我想补充的是,当
$aPosition
bPosition
相同时,您应该决定该怎么做,这是可能发生的。在这个例子中,就好像
$aPosition
“赢了”。@Sohnee:就像我说的,这里有一些假设。根据您的数据和数据来源,这种情况可能永远不会发生
id
意味着数据具有某种程度的唯一性。@Jan:如果需要支持PHP<5.3,只需将闭包分解为回调。如果没有,那么就享受新的5.3 goodness。请注意,每次比较
$values
的两个成员时,您都会进行两次数组搜索。如果
$values
获取了以下信息,您可能需要记忆
数组搜索调用的结果large@Matthew沙利:我只是想让你知道,我意识到这是一个原则的证明,而且是一个坚实的证明。但是,如果OP决定实现它,那么处理双
数组搜索可能会变得很重要。我要补充的是,当
$aPosition
bPosition
相同时,您应该决定要做什么,这可能会发生。在这个例子中,就好像
$aPosition
“赢了”。@Sohnee:就像我说的,这里有一些假设。根据您的数据和数据来源,这种情况可能永远不会发生
id
意味着数据具有某种程度的唯一性。@Jan:如果需要支持PHP<5.3,只需将闭包分解为回调。如果没有,那么就享受新的5.3 goodness。请注意,每次比较
$values
的两个成员时,您都会进行两次数组搜索。如果
$values
获取了以下信息,您可能需要记忆
数组搜索调用的结果large@Matthew沙利:我只是想让你知道,我意识到这是一个原则的证明,而且是一个坚实的证明。但是,如果OP决定实现它,那么处理双
数组搜索可能会变成im