对不起,我的英语不好,我想在对象中输入一行。我想要按随机顺序排列。我正在使用array_rand()
,它只返回如下错误:
ErrorException:array_rand()期望参数1为数组,对象在文件C:\ xampp \ htdocs \ user \ TestProject \ app \ Http \ Controllers \ TestController.php中给出
这是我的对象。
"my_list": [
{
"id": 1,
"name": "My Name Test",
"address": [
{
"id": 1,
"city": "Manila",
"country": "Philippines"
}
]
},
{
"id": 2,
"name": "Your Name Test",
"address": [
{
"id": 2,
"city": "Cebu",
"country": "Philippines",
}
]
}
]
问题是我只想向my_list
到object
而不是array
一行。
这是我的代码。
$course = Course::where('id', 1)->with('my_list')->first();
$random_list = array_rand($course->my_list);
return $random_list;
我还尝试像这样在array_rand
中添加行数。
$random_list = array_rand($course->my_list, 1);
但仍然无法正常工作。
我错过了什么?
答案 0 :(得分:2)
尝试此方法:
$course = Course::where('id', 1)
->with(['my_list' => function($query) {
$query->inRandomOrder()->first();
}])->first();
return $course->my_list;
此方法效率更高,因为您只会从my_list
获得1行,这与使用$course->my_list->random()
检索所有数据并从那里选择随机行的情况不同。
答案 1 :(得分:1)
任何雄辩的查询默认情况下都会返回Collection,即使对于基础关系也是如此。由于您正在使用一个,因此应该可以:
private void showStateList(List<State> states) {
if (states != null) {
this.lstStates = states;
if(stateAdapter == null){
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
stateFragmentBinding.stateRecyclerView.setLayoutManager(linearLayoutManager);
stateFragmentBinding.stateRecyclerView.addItemDecoration(new DividerItemDecoration(stateFragmentBinding.stateRecyclerView.getContext(),
linearLayoutManager.getOrientation()));
stateFragmentBinding.stateRecyclerView.setHasFixedSize(true);
stateAdapter = new StateAdapter(lstStates, this);
stateFragmentBinding.stateRecyclerView.setAdapter(stateAdapter);
}
else{
stateAdapter.notifyDataSetChanged(lstStates);
}
}
}
这将仅返回一项。如果需要更多,可以将参数传递给 class StateAdapter extends RecyclerView.Adapter<StateViewHolder> {
private LayoutInflater inflater;
private StateClickListener stateClickListener;
private List<State> lstStateItem;
public StateAdapter(List<State> lstStateItem, StateClickListener stateClickListener) {
this.lstStateItem = lstStateItem;
this.stateClickListener = stateClickListener;
}
@NonNull
@Override
public StateViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
if (inflater == null)
inflater = LayoutInflater.from(viewGroup.getContext());
StateAdapterBinding stateAdapterBinding = StateAdapterBinding.inflate(inflater, viewGroup, false);
return new StateViewHolder(stateAdapterBinding, stateClickListener);
}
@Override
public void onBindViewHolder(@NonNull StateViewHolder stateViewHolder, int position) {
State state = lstStateItem.get(position);
stateViewHolder.bind(state, position);
}
@Override
public int getItemCount() {
return lstStateItem.size();
}
public void notifyDataSetChanged(List<State> states) {
List<State> tempList = new ArrayList<>(states);
lstStateItem.clear();
lstStateItem.addAll(tempList);
this.notifyDataSetChanged();
}
}
方法,以指定所需的项目数。
有关更多信息,请检查documentation.
答案 2 :(得分:1)
如果您仍然想使用此方法,可以尝试使用get_object_vars函数将对象转换为数组。
$array = get_object_vars($object);
以便您可以将它们用作array_rand中的数组。
您可能会遇到错误,因此它是一个多维数组。让我知道,以便我进行更新。
针对多维更新:
请参阅此内容。
// json_decode的第二个参数强制解析为关联数组
$ array = json_decode(json_encode($ object),true);
答案 3 :(得分:1)
此Object
是Laravel集合。请参考收集文档。
https://laravel.com/docs/5.7/collections#method-random
您可以尝试$course->my_list->random()
答案 4 :(得分:1)
尝试一下:
$course = Course::where('id', 1)
->with(['my_list' => function($query) {
$query->inRandomOrder();
}])->first();
return $course->my_list;
答案 5 :(得分:0)
pip install ta-lib
ps: number = 你想要获取的元素个数,