PHP Array Конвертировать его формат

1

когда я получаю данные из базы данных, используя мой запрос 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]);
                }
            }
        }   
  • 0
    Я попытался преобразовать его с помощью цикла foreach. см мой обновленный вопрос.
  • 0
    хм, я отправил ответ, но теперь я вижу, что он отличается от ожидаемого, каково значение начальных индексов массива в желаемом выводе (т. е. от 0 до 2 ), неясно ??? я могу обновить ответ, как только это станет ясно
Теги:
arrays

2 ответа

1
Лучший ответ

обновляется после уточнений

используйте этот 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
                )

        )        
  • 0
    я обновил свой вопрос с изображением.
  • 0
    @ManishPrajapati, поэтому начальные индексы соответствуют строкам с другим product , это правильно?
Показать ещё 3 комментария
1

Вы можете использовать функцию php array_column и реорганизовать свой массив в новый массив с требуемой структурой и минимальными усилиями:

$result = array();
$result['DispensaryInventory'] = array_column($data, 'DispensaryInventory');
$result['ProductOption'] = array_column($data, 'ProductOption');
$result['Product'] = array_column($data, 'Product');

Ещё вопросы

Сообщество Overcoder
Наверх
Меню