Php Laravel按键排序对象
我有以下内容,我想按字母顺序排列,即每个数组组的第一个字母是“bname”,然后是“created_at” 我尝试在foreach循环中使用ksort,如下所示:Php Laravel按键排序对象,php,laravel,sorting,Php,Laravel,Sorting,我有以下内容,我想按字母顺序排列,即每个数组组的第一个字母是“bname”,然后是“created_at” 我尝试在foreach循环中使用ksort,如下所示: class LeadController extends Controller { use Helpers; public function index(Lead $leads) { $leads = $leads->all(); foreach($leads as $
class LeadController extends Controller
{
use Helpers;
public function index(Lead $leads)
{
$leads = $leads->all();
foreach($leads as $key => $lead){
$lead->user = User::where('id', $lead->user_id)->first()->name;
$lead->source = Source::where('id', $lead->source_id)->first()->name;
$lead->industry = Industry::where('id', $lead->industry_id)->first()->name;
$lead->ksort();
}
return $leads;
}
但我得到了以下错误:
Call to undefined method Illuminate\\Database\\Query\\Builder::ksort()
我该如何使用这个函数,或者有没有一个Laravel的方法,或者有一个更好的方法
谢谢。设法让它按字母顺序返回,因此以下是其他人需要它时的解决方案:
public function index(Lead $leads)
{
$leadOut = Array();
$leads = $leads->all();
foreach($leads as $key => $lead){
$lead->user = User::where('id', $lead->user_id)->first()->name;
$lead->source = Source::where('id', $lead->source_id)->first()->name;
$lead->industry = Industry::where('id', $lead->industry_id)->first()->name;
//Convert to Array
$leadOrder = $lead->toArray();
//Sort as desired
ksort($leadOrder);
//Add to array
$leadOut[] = $leadOrder;
}
return $leadOut;
}
可能有一种更干净的方法可以做到这一点,但它适用于我的实例,并且可能会发布更好的其他答案。您可以这样做:
return Lead::with('user', 'source', 'industry')->get()->map(function ($lead) {
$item = $lead->toArray();
$item['user'] = $lead->user->name;
$item['source'] = $lead->source->name;
$item['industry'] = $lead->industry->name;
ksort($item);
return $item;
});
这应该更有效,因为它将急切地加载关系,而不是为每个迭代进行3次额外的查询。1)按什么“键”?2) 这些数据来自哪里?什么是
$lead
?它是如何赋值的?@Phil请参见编辑并澄清对象键的顺序不应对数据结构产生任何影响。这有什么关系?就个人而言,我不在乎它们的顺序,因为我可以按名字称呼它们,但我被要求按字母顺序输出它们。显然,$leads->all()
正在返回illighte\Database\Query\Builder
对象的集合,而您似乎希望它们是使用ksort
方法的其他对象。您可能应该弄清楚为什么会出现这种情况。我得到错误:“isset或empty中的非法偏移量类型”@SeánMcCabe您使用的是什么版本的PHP,以及您使用的是什么版本的Laravel?5.6.31和5.4。我现在已经使用分形解决了整个问题,允许我按照请求的顺序输出内容,并更改名称以确保安全。控制器现在只有两行$leads=Lead::with('user','source','industry','status')->get();返回分形($leads,new leadstransformer())->respond();
return Lead::with('user', 'source', 'industry')->get()->map(function ($lead) {
$item = $lead->toArray();
$item['user'] = $lead->user->name;
$item['source'] = $lead->source->name;
$item['industry'] = $lead->industry->name;
ksort($item);
return $item;
});