我有一个“发布”对象,通过 IOC 容器访问。各种错误告诉我这个对象的类型最终是一个“集合”,它实现了几个接口,包括 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,但由于它现在是一个数组,我无法访问我视图中的 $posts 对象。我可以将数组转换回 post 对象吗?
无论如何,这整个方法都感觉很浪费,转换为数组并返回......是吗?有没有更直接的方法来对“集合”的内容进行排序?
这可能好一点(一个原生 php 函数):
array_multisort($desired,$posts,SORT_STRING);
//only works with string keys
//$desire=(1,2,3) will not work!
同样,这适用于数组,但直接在“posts”对象上尝试失败......
最后,我发现使用演示者:https ://github.com/robclancy/presenter#array-usage在控制器中完成上述一项后,它在视图中工作:
@foreach($posts as $post)
<?php $post=new PostPresenter($post) ?>
{{View::make('site.post.article')->with(compact('post'))}}
@endforeach
这终于奏效了,但感觉仍然有很长的路要走。有没有更好的方法来完成这项任务?一种方法与另一种方法的性能问题或最佳实践?提前感谢任何能够提供帮助的人。