когда я получаю данные из базы данных, используя мой запрос cakephp, используя find ('all'), тогда он возвращает массив. ok, тогда результирующий массив мне не нравится, чтобы показывать эти данные на странице. означает, что он генерирует несколько строк. я проверил его в Google, но ответа не найдено.
Примечание: Фильтр массива Должен соответствовать массиву ['DispensaryInventory'] ['product_id']
мой массив:
Array
(
[0] => Array
(
[DispensaryInventory] => Array
(
[id] => 15
[dispensary_id] => 1
[product_id] => 9
[quantity] =>
[price] =>
)
[ProductOption] => Array
(
[value] => 2
[unit] => oz
)
[Product] => Array
(
[id] => 9
[name] => Bajaj
)
)
[1] => Array
(
[DispensaryInventory] => Array
(
[id] => 11
[dispensary_id] => 1
[product_id] => 9
[quantity] => 17
[price] => 12.00
)
[ProductOption] => Array
(
[value] => 1/8
[unit] => oz
)
[Product] => Array
(
[id] => 9
[name] => Bajaj
)
)
[2] => Array
(
[DispensaryInventory] => Array
(
[id] => 12
[dispensary_id] => 1
[product_id] => 9
[quantity] =>
[price] =>
)
[ProductOption] => Array
(
[value] => 1/4
[unit] => oz
)
[Product] => Array
(
[id] => 9
[name] => Bajaj
)
)
[3] => Array
(
[DispensaryInventory] => Array
(
[id] => 13
[dispensary_id] => 1
[product_id] => 9
[quantity] => 5
[price] => 123.00
)
[ProductOption] => Array
(
[value] => 1/2
[unit] => oz
)
[Product] => Array
(
[id] => 9
[name] => Bajaj
)
)
[4] => Array
(
[DispensaryInventory] => Array
(
[id] => 14
[dispensary_id] => 1
[product_id] => 9
[quantity] =>
[price] =>
)
[ProductOption] => Array
(
[value] => 1
[unit] => oz
)
[Product] => Array
(
[id] => 9
[name] => Bajaj
)
)
[5] => Array
(
[DispensaryInventory] => Array
(
[id] => 5
[dispensary_id] => 1
[product_id] => 8
[quantity] =>
[price] =>
)
[ProductOption] => Array
(
[value] => 2
[unit] => oz
)
[Product] => Array
(
[id] => 8
[name] => BMW
)
)
[6] => Array
(
[DispensaryInventory] => Array
(
[id] => 1
[dispensary_id] => 1
[product_id] => 8
[quantity] => 2
[price] => 123.00
)
[ProductOption] => Array
(
[value] => 1/8
[unit] => oz
)
[Product] => Array
(
[id] => 8
[name] => BMW
)
)
[7] => Array
(
[DispensaryInventory] => Array
(
[id] => 2
[dispensary_id] => 1
[product_id] => 8
[quantity] =>
[price] =>
)
[ProductOption] => Array
(
[value] => 1/4
[unit] => oz
)
[Product] => Array
(
[id] => 8
[name] => BMW
)
)
[8] => Array
(
[DispensaryInventory] => Array
(
[id] => 3
[dispensary_id] => 1
[product_id] => 8
[quantity] => 23
[price] => 222.00
)
[ProductOption] => Array
(
[value] => 1/2
[unit] => oz
)
[Product] => Array
(
[id] => 8
[name] => BMW
)
)
[9] => Array
(
[DispensaryInventory] => Array
(
[id] => 4
[dispensary_id] => 1
[product_id] => 8
[quantity] => 12
[price] => 232.00
)
[ProductOption] => Array
(
[value] => 1
[unit] => oz
)
[Product] => Array
(
[id] => 8
[name] => BMW
)
)
[10] => Array
(
[DispensaryInventory] => Array
(
[id] => 6
[dispensary_id] => 1
[product_id] => 3
[quantity] => 3
[price] => 21.00
)
[ProductOption] => Array
(
[value] => 1/8
[unit] => oz
)
[Product] => Array
(
[id] => 3
[name] => Yash product
)
)
[11] => Array
(
[DispensaryInventory] => Array
(
[id] => 7
[dispensary_id] => 1
[product_id] => 3
[quantity] => 12
[price] => 56.00
)
[ProductOption] => Array
(
[value] => 1/4
[unit] => oz
)
[Product] => Array
(
[id] => 3
[name] => Yash product
)
)
[12] => Array
(
[DispensaryInventory] => Array
(
[id] => 8
[dispensary_id] => 1
[product_id] => 3
[quantity] =>
[price] =>
)
[ProductOption] => Array
(
[value] => 1/2
[unit] => oz
)
[Product] => Array
(
[id] => 3
[name] => Yash product
)
)
[13] => Array
(
[DispensaryInventory] => Array
(
[id] => 9
[dispensary_id] => 1
[product_id] => 3
[quantity] => 15
[price] => 354.00
)
[ProductOption] => Array
(
[value] => 1
[unit] => oz
)
[Product] => Array
(
[id] => 3
[name] => Yash product
)
)
[14] => Array
(
[DispensaryInventory] => Array
(
[id] => 10
[dispensary_id] => 1
[product_id] => 3
[quantity] =>
[price] =>
)
[ProductOption] => Array
(
[value] => 2
[unit] => oz
)
[Product] => Array
(
[id] => 3
[name] => Yash product
)
)
)
и я хочу выглядеть как этот массив
Array
(
[0] => Array
(
[DispensaryInventory] => Array
(
[0] => Array
(
[id] => 15
[dispensary_id] => 1
[product_id] => 9
[quantity] =>
[price] =>
)
[1] => Array
(
[id] => 11
[dispensary_id] => 1
[product_id] => 9
[quantity] => 17
[price] => 12.00
)
[2] => Array
(
[id] => 12
[dispensary_id] => 1
[product_id] => 9
[quantity] =>
[price] =>
)
[3] => Array
(
[id] => 13
[dispensary_id] => 1
[product_id] => 9
[quantity] => 5
[price] => 123.00
)
[4] => Array
(
[id] => 14
[dispensary_id] => 1
[product_id] => 9
[quantity] =>
[price] =>
)
)
[ProductOption] => Array
(
[0] => Array
(
[value] => 2
[unit] => oz
)
[1] => Array
(
[value] => 1/8
[unit] => oz
)
[2] => Array
(
[value] => 1/4
[unit] => oz
)
[3] => Array
(
[value] => 1/2
[unit] => oz
)
[4] => Array
(
[value] => 1
[unit] => oz
)
)
[Product] => Array
(
[id] => 9
[name] => Bajaj
)
)
[1] => Array
(
[DispensaryInventory] => Array
(
[0] => Array
(
[id] => 5
[dispensary_id] => 1
[product_id] => 8
[quantity] =>
[price] =>
)
[1] => Array
(
[id] => 1
[dispensary_id] => 1
[product_id] => 8
[quantity] => 2
[price] => 123.00
)
[2] => Array
(
[id] => 2
[dispensary_id] => 1
[product_id] => 8
[quantity] =>
[price] =>
)
[3] => Array
(
[id] => 3
[dispensary_id] => 1
[product_id] => 8
[quantity] => 23
[price] => 222.00
)
[4] => Array
(
[id] => 4
[dispensary_id] => 1
[product_id] => 8
[quantity] => 12
[price] => 232.00
)
)
[ProductOption] => Array
(
[0] => Array
(
[value] => 2
[unit] => oz
)
[1] => Array
(
[value] => 1/8
[unit] => oz
)
[2] => Array
(
[value] => 1/4
[unit] => oz
)
[3] => Array
(
[value] => 1/2
[unit] => oz
)
[4] => Array
(
[value] => 1
[unit] => oz
)
)
[Product] => Array
(
[id] => 8
[name] => BMW
)
)
[2] => Array
(
[DispensaryInventory] => Array
(
[0] => Array
(
[id] => 6
[dispensary_id] => 1
[product_id] => 3
[quantity] => 3
[price] => 21.00
)
[1] => Array
(
[id] => 7
[dispensary_id] => 1
[product_id] => 3
[quantity] => 12
[price] => 56.00
)
[2] => Array
(
[id] => 2
[id] => 8
[dispensary_id] => 1
[product_id] => 3
[quantity] =>
[price] =>
)
[3] => Array
(
[id] => 9
[dispensary_id] => 1
[product_id] => 3
[quantity] => 15
[price] => 354.00
)
[4] => Array
(
[id] => 10
[dispensary_id] => 1
[product_id] => 3
[quantity] =>
[price] =>
)
)
[ProductOption] => Array
(
[0] => Array
(
[value] => 2
[unit] => oz
)
[1] => Array
(
[value] => 1/8
[unit] => oz
)
[2] => Array
(
[value] => 1/4
[unit] => oz
)
[3] => Array
(
[value] => 1/2
[unit] => oz
)
[4] => Array
(
[value] => 1
[unit] => oz
)
)
[Product] => Array
(
[id] => 3
[name] => Yash product
)
)
Обновление:
Я пробовал.
foreach($dispensary_inventory_data as $k1=>$a1){
foreach($dispensary_inventory_data as $k2=>$a2){
if($k1 < $k2 && $a1["DispensaryInventory"]["product_id"] == $a2["DispensaryInventory"]["product_id"]){
$dispensary_inventory_data[$k1]["ProductOption"][] = $a2["ProductOption"];
$dispensary_inventory_data[$k1]["Product"][] = $a2["Product"];
if(isset($dispensary_inventory_data[$k1]["Product"]["id"])){
$dispensary_inventory_data[$k1]["Product"][] = array(
"id"=>$dispensary_inventory_data[$k1]["Product"]["id"],
"name"=>$dispensary_inventory_data[$k1]["Product"]["name"],
"quantity"=>$dispensary_inventory_data[$k1]["Product"]["quantity"]
);
$dispensary_inventory_data[$k1]["ProductOption"][] = array(
"id"=>$dispensary_inventory_data[$k1]["ProductOption"]["id"],
"value"=>$dispensary_inventory_data[$k1]["ProductOption"]["value"],
"unit"=>$dispensary_inventory_data[$k1]["ProductOption"]["unit"]
);
unset($dispensary_inventory_data[$k1]["Product"]["id"]);
unset($dispensary_inventory_data[$k1]["Product"]["name"]);
unset($dispensary_inventory_data[$k1]["Product"]["city"]);
unset($dispensary_inventory_data[$k1]["Product"]["quantity"]);
unset($dispensary_inventory_data[$k1]["ProductOption"]["id"]);
unset($dispensary_inventory_data[$k1]["ProductOption"]["value"]);
unset($dispensary_inventory_data[$k1]["ProductOption"]["unit"]);
}
unset($dispensary_inventory_data[$k2]);
}
}
}
обновляется после уточнений
используйте этот fnction, чтобы преобразовать массив в необходимый формат:
function my_format($data)
{
$data2 = array();
foreach($data as $val)
{
$keys = array_keys($val);
// you can also use $val['DispensaryInventory']['product_id'] here,
// but i take it these refer to the same thing
$product_id = $val['Product']['id'];
if (!isset($data2[$product_id])) $data2[$product_id] = array();
foreach($keys as $key)
{
if ( 'Product' === $key ) $data2[$product_id][$key] = $val[$key];
elseif ( !isset($data2[$product_id][$key]) ) $data2[$product_id][$key] = array($val[$key]);
else $data2[$product_id][$key][] = $val[$key];
}
}
return array_values($data2); // you can also return the $data2 here
}
используйте следующее:
$new_data = my_format($data);
(ожидаемый) выход (не тестировался)
Array
(
[0] => Array
(
[DispensaryInventory] => Array
(
[0] => Array
(
[id] => 15
[dispensary_id] => 1
[product_id] => 9
[quantity] =>
[price] =>
)
[1] => Array
(
[id] => 11
[dispensary_id] => 1
[product_id] => 9
[quantity] => 17
[price] => 12.00
)
[2] => Array
(
[id] => 12
[dispensary_id] => 1
[product_id] => 9
[quantity] =>
[price] =>
)
[3] => Array
(
[id] => 13
[dispensary_id] => 1
[product_id] => 9
[quantity] => 5
[price] => 123.00
)
[4] => Array
(
[id] => 14
[dispensary_id] => 1
[product_id] => 9
[quantity] =>
[price] =>
)
)
[ProductOption] => Array
(
[0] => Array
(
[value] => 2
[unit] => oz
)
[1] => Array
(
[value] => 1/8
[unit] => oz
)
[2] => Array
(
[value] => 1/4
[unit] => oz
)
[3] => Array
(
[value] => 1/2
[unit] => oz
)
[4] => Array
(
[value] => 1
[unit] => oz
)
)
[Product] => Array
(
[id] => 9
[name] => Bajaj
)
)
[1] => Array
(
[DispensaryInventory] => Array
(
[0] => Array
(
[id] => 5
[dispensary_id] => 1
[product_id] => 8
[quantity] =>
[price] =>
)
[1] => Array
(
[id] => 1
[dispensary_id] => 1
[product_id] => 8
[quantity] => 2
[price] => 123.00
)
[2] => Array
(
[id] => 2
[dispensary_id] => 1
[product_id] => 8
[quantity] =>
[price] =>
)
[3] => Array
(
[id] => 3
[dispensary_id] => 1
[product_id] => 8
[quantity] => 23
[price] => 222.00
)
[4] => Array
(
[id] => 4
[dispensary_id] => 1
[product_id] => 8
[quantity] => 12
[price] => 232.00
)
)
[ProductOption] => Array
(
[0] => Array
(
[value] => 2
[unit] => oz
)
[1] => Array
(
[value] => 1/8
[unit] => oz
)
[2] => Array
(
[value] => 1/4
[unit] => oz
)
[3] => Array
(
[value] => 1/2
[unit] => oz
)
[4] => Array
(
[value] => 1
[unit] => oz
)
)
[Product] => Array
(
[id] => 8
[name] => BMW
)
)
[2] => Array
(
[DispensaryInventory] => Array
(
[0] => Array
(
[id] => 6
[dispensary_id] => 1
[product_id] => 3
[quantity] => 3
[price] => 21.00
)
[1] => Array
(
[id] => 7
[dispensary_id] => 1
[product_id] => 3
[quantity] => 12
[price] => 56.00
)
[2] => Array
(
[id] => 2
[id] => 8
[dispensary_id] => 1
[product_id] => 3
[quantity] =>
[price] =>
)
[3] => Array
(
[id] => 9
[dispensary_id] => 1
[product_id] => 3
[quantity] => 15
[price] => 354.00
)
[4] => Array
(
[id] => 10
[dispensary_id] => 1
[product_id] => 3
[quantity] =>
[price] =>
)
)
[ProductOption] => Array
(
[0] => Array
(
[value] => 2
[unit] => oz
)
[1] => Array
(
[value] => 1/8
[unit] => oz
)
[2] => Array
(
[value] => 1/4
[unit] => oz
)
[3] => Array
(
[value] => 1/2
[unit] => oz
)
[4] => Array
(
[value] => 1
[unit] => oz
)
)
[Product] => Array
(
[id] => 3
[name] => Yash product
)
)
product
, это правильно?
Вы можете использовать функцию php array_column и реорганизовать свой массив в новый массив с требуемой структурой и минимальными усилиями:
$result = array();
$result['DispensaryInventory'] = array_column($data, 'DispensaryInventory');
$result['ProductOption'] = array_column($data, 'ProductOption');
$result['Product'] = array_column($data, 'Product');
0
до2
), неясно ??? я могу обновить ответ, как только это станет ясно