PHP 迭代器自定义排序顺序 (Laravel 4)

标签 php arrays sorting laravel laravel-4

我有一个“Post”对象,通过 IOC 容器访问。各种错误告诉我该对象的类型最终为“Collection ”,它实现了多个接口(interface),包括 IteratorAggregate 和 ArrayAccess。

我想根据特定顺序显示用户定义的帖子组,例如:

$desired=array("69","63","70");//these represent post id's

以这种方式对数组进行排序似乎很复杂,但我想对我的集合进行排序。我一直在研究 usort()、uksort()、Eloquent 的 sortBy()、array_multisort() 的各种组合...但最明显的解决方案结果是 3,2,1 或 1,2,3,而不是 2, 1,3。

我最接近这个目标的就是获取我想要的,

//BlogController
private function myposts($desired){
    $posts=$this->post->whereIn('id',$desired)->get();
    ...

将 Collection 对象“转换”为数组,

$posts=$posts->toArray();

并使用自定义函数处理数组:source

function sortArrayByArray($array,$orderArray) {
    $ordered = array();
    foreach($orderArray as $key) {
        if(array_key_exists($key,$array)) {
            $ordered[$key] = $array[$key];
            unset($array[$key]);
        }
    }
    return $ordered + $array;
}
$sorted=sortArrayByArray($array1,$desired);

然后我可以按正确的顺序 vardump 数组,但由于它现在是一个数组,因此我无法访问 View 中的 $posts 对象。我可以将数组转换回 post 对象吗?

无论如何,整个方法感觉很浪费,转换为数组然后返回......是吗?有没有更直接的方法来对“集合”的内容进行排序?

这也许好一点(本地 PHP 函数):

array_multisort($desired,$posts,SORT_STRING);
//only works with string keys
//$desire=(1,2,3) will not work!

同样,这适用于数组,但直接尝试“posts”对象会失败......

最后,我发现使用 Presenter:https://github.com/robclancy/presenter#array-usage在 Controller 中完成上述操作之一后,它在 View 中工作:

@foreach($posts as $post)
<?php $post=new PostPresenter($post) ?>
{{View::make('site.post.article')->with(compact('post'))}}
@endforeach

这终于可行了,但感觉仍然有很长的路要走。有更好的方法来完成这项任务吗?一种方法与另一种方法的性能问题或最佳实践?预先感谢任何能够提供帮助的人。

最佳答案

您可以使用自己的收藏集sort方法并传入回调。回调会比较集合中的每两个值,告诉排序方法哪一个“更高”。然后排序方法对它们进行相应的排序。如果您想要特定的值顺序,您只需创建映射并按其排序。欲了解更多信息,请查看uasort

$posts->sort(function($a, $b){
    $desired=array("69" => 0,"63" => 1,"70" =>2);
    if(!array_key_exists($a,$desired) || !array_key_exists($b,$desired) || $a == $b){
        return 0
    }
    else{
        return ($desired[$a] < $desired[$b]) ? -1 : 1;
    }
});

关于PHP 迭代器自定义排序顺序 (Laravel 4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18443990/

相关文章:

arrays - Swift:获取二维数组中最小项的索引

arrays - 无法将函数参数分配给 `Zsh` 中的局部数组变量

python - 如何在numpy中以3x3矩阵的形式获取特定数字的周围数字?

python - 将排序列表重新映射到字典中

使用 MySQL 的 PHP 很慢

php - Cloud9 和 MySQL,连接被拒绝

java - 打包问题: items into constrained bins (Solution to singular matrix)

sorting - 更改下拉列表中关键字的默认顺序

php - CakePHP 中的变量命名约定

php - 在 PHP 中使用 header 传递 GET 变量