我有一个
ArrayDataProvider
为 Items
,由以下形式的函数返回:
public function builder() {
$items = Item::find()->all();
$dataProvider = new ArrayDataProvider([
'allModels' => $items,
'pagination' => false,
'id' => 'items_dp'
]);
return $dataProvider;
}
由于各种原因,我需要这个函数的代码保持原样。
我的问题是,如果我有一个
Item
id
、myItemIds
的列表,有什么方法可以在 DataProvider 中一一快速选择具有这些 Item
的 id
吗?
例如,在如下应用程序中:
$provider = builder();
$myItemIds = [112,321,422];
$superItems = [];
foreach ($myItemIds->each() as $itemId) {
$superItem = // builder based on data from the Item in DataProvider with id = $itemId and other things;
$superItems[] = $superItem;
}
考虑到您的场景以及保持
builder
函数不变的约束,要在具有特定 ID (Items
) 的 ArrayDataProvider
中选择 $myItemIds
,您需要迭代数据提供者的模型并检查是否项目的 ID 在您的 ID 列表中。以下是如何实现此目标的示例:
$provider = builder(); // Assuming this calls your builder function and returns an ArrayDataProvider
$myItemIds = [112, 321, 422];
$superItems = [];
// Get all models from the provider
$allModels = $provider->allModels;
// Iterate through the list of IDs you want to find
foreach ($myItemIds as $itemId) {
// Search for the item by ID in the array of all models
$key = array_search($itemId, array_column($allModels, 'id'));
if ($key !== false) {
// If the item is found, you can process it as needed
$item = $allModels[$key];
// Assuming you have some logic to build a "super item" from an item
$superItem = // Your logic to transform $item into $superItem goes here;
$superItems[] = $superItem;
}
}
// Now $superItems contains your processed items
此代码片段假设
$allModels
包含一个对象数组,其中每个对象都有一个 id
属性,您可以将其与所需项目 ID 列表进行比较 ($myItemIds
)。 array_search
函数与array_column
配合使用,可以根据ID在所有模型的数组中查找每一项的索引。一旦找到某个项目,您就可以根据需要对其进行处理,并将结果添加到 $superItems
数组中。
注意:此方法假设
id
字段可在项目对象上直接访问,并且 $allModels
是一个简单的对象数组。如果您的实际数据结构不同,您可能需要相应调整搜索逻辑。