使用动态数据在 PHP 中创建多维数组

Create Multidimensional Array in PHP with Dynamic Data

我正在为一家按月提供食物的餐厅准备菜单系统。这是我的问题:

餐厅提供不同的套餐。每包每天包含若干份。例如,套餐 A 每天供应 3 次,而套餐 B 每天供应 2 次。我正在构建的在线订购系统是一个按天数划分的多页面订购系统。所以 20 天,有 20 页。一天的选择完成后,我想将选择存储在多维数组中。请参考以下结构。

$selection_package_a = array( 
   "Serving_Day1" => array (
      "Serving_1" => Pizza,
      "Serving_2" => Salad, 
      "Serving_3" => Smoothies
   ),
   "Serving_Day2" => array (
      "Serving_1" => Salad,
      "Serving_2" => Juices,    
      "Serving_3" => Fruits
   ),
);

$selection_package_b = array( 
   "Serving_Day1" => array (
      "Serving_1" => Pizza,
      "Serving_2" => Salad
   ),
   "Serving_Day2" => array (
      "Serving_1" => Salad,
      "Serving_2" => Juices
   ),
);

"Serving_Day1" 到 "Serving_Day20" 取决于一个月的服务天数。因此,如果包裹每月仅投放 10 天,则 "Serving_Day10" 将是最后一个字段。

在 "Serving_Day1"、"Serving_1" 等范围内取决于数据库中存储的服务数量。

承接@yarwest的回答,我把进度贴到现在。我想这只是实现所需输出的又一步。

$meals_selected_array = [];

$total_meals_array = [];

if( $num_row_packages >= 1 ) {
    while($row_packages = mysqli_fetch_array ($result_packages)) {
        $package_id = $row_packages['package_id'];
        $package_name = $row_packages['package_name'];
        $servings_count = $row_packages['servings_count'];
        $days_served = $row_packages['days_served'];

        //repeating it based on the number of days_served
        for ($i = 1; $i <= $days_served; $i++) {
            //how to define/declare $total_meals_array['day_' . $i]            

            //adding user selection for the day in $meals_selected_array array
            for ($y = 1; $y <= $servings_count; $y++) {
                $meals_selected_array["meal_id_day_" .$i] = "Not Available";
                $meals_selected_array["meal_code_day_" .$i] = "Not Available";
                $meals_selected_array["meal_type_day_" .$i] = "Meal";
            }

            //what to do either here or after the below loop in order to add $meals_selected_array above values to $total_meals_array['day_' . $i].
        }          
    }
}

当我 $print_r($meals_selected_array) 时,我得到的结果是一个具有完美标签和值的关联数组。现在我只需将这个关联数组添加到每一天,使我的主数组成为多维数组。

所以我想要的 $total_meals_array 输出如下:

Array
(
    [day_1] => Array
        (
            [meal_id_day_1] => "1" //This will be my Unique ID of selected meal
            [meal_code_day_1] => "Pizza" //This will be the name of meal
            [meal_type_day_1] => "Main Course" //This will be the serving Type
        )

    [day_2] => Array
        (
            [meal_id_day_2] => "4" //This will be my Unique ID of selected meal
            [meal_code_day_2] => "Lemonade" //This will be the name of meal
            [meal_type_day_2] => "Drinks" //This will be the serving Type
        )

    [day_3] => Array
        (
            [meal_id_day_3] => "8" //This will be my Unique ID of selected meal
            [meal_code_day_3] => "Custard" //This will be the name of meal
            [meal_type_day_3] => "Dessert" //This will be the serving Type
        )

)

事前重要提示

使用mysqli函数非常不安全。它们可以很容易地被操纵,例如 SQL 注入。而是使用 PDO and Prepared Statements.

解决方案

您从数据库中检索了一个包。 下一步是根据份量和天数循环创建一个新数组来保存包裹。

if( $num_row_packages >= 1 ) {
    while($row_packages = mysqli_fetch_array ($result_packages)) {
        $package_id = $row_packages['package_id'];
        $package_name = $row_packages['package_name'];
        $servings_count = $row_packages['servings_count'];
        $days_served = $row_packages['days_served'];

        //Create a new array to hold the servings skeleton
        $servingsArray = [];
        //For every serving add an empty string to the servingArray
        for($i = 0; $i < $servings_count; $i++){
            array_push(
                $servingsArray,
                ""
            );
        }

        //Create a new array to hold the package skeleton
        $selection_package = [];
        //For every day add an servingArray to the package array
        for($i = 0; $i < $days_served; $i++){
            array_push(
                $selection_package,
                $servingsArray
            );
        }           
    }
}

这将根据指定的结构创建一个完全空的数组。

现在这是在给定情况下最有效的代码。

情况
订购单是多页的,具体取决于基于所选包裹的服务天数。每个包的详细信息都存储在数据库中,字段如下:

  1. package_id(唯一字段)
  2. package_name(包的名称,例如包 A)
  3. servings_count(一天总份数)
  4. days_served(一个月的服务天数)

为了将每天的膳食选择和当天的服务作为订单存储在数据库中,我需要一个 PHP 的多维数组,它可以是 defined/populated动态地。

预期输出类似于:

Array
(
    [Day 1] => Array
        (
            [meal_id_1] => Unique ID //to be replaced with user selection
            [meal_code_1] => Meal Name //to be replaced with user selection
            [meal_type_1] => Meal //prefilled based on the selected package
            [meal_id_2] => Not Available //to be replaced with user selection
            [meal_code_2] => 2 //to be replaced with user selection
            [meal_type_2] => Meal //prefilled based on the selected package
        )

    [Day 2] => Array
        (
            [meal_id_1] => Unique ID //to be replaced with user selection
            [meal_code_1] => Meal Name //to be replaced with user selection
            [meal_type_1] => Meal //prefilled based on the selected package
            [meal_id_2] => Not Available //to be replaced with user selection
            [meal_code_2] => 2 //to be replaced with user selection
            [meal_type_2] => Meal //prefilled based on the selected package
        )

上面的数组是根据解释的结构、份数和天数 100% 动态创建的。下面是带有一些解释的代码。

首先,我们必须声明两个PHP数组。

$total_meals_array = []; //Primary, Multidimension Array
$meals_selected_array = []; //Meals Details Array to be used as primary array's key value.

执行此操作后,运行 MySQL 查询从数据库中读取包。现在根据结果,执行以下操作:

$total_meals_array = []; //Primary, Multidimension Array
$meals_selected_array = []; //Meals Details Array to be used as primary array's key value.

if( $num_row_packages >= 1 ) {
    while($row_packages = mysqli_fetch_array ($result_packages)) {
        $package_id = $row_packages['package_id'];
        $package_name = $row_packages['package_name'];
        $servings_count = $row_packages['servings_count'];
        $days_served = $row_packages['days_served'];

        //this for loop is to repeat the code inside `$days_served` number of times. This will be defining our primary and main Multidimensional Array `$total_meals_array`.
        for ($y = 1; $y <= $days_served; $y++) {
            //once inside the code, now is the time to define/populate our secondary array that will be used as primary array's key value. `$i`, which is the meal count of each day, will be added to the key name to make it easier to read it later. This will be repeated `$meals_count` times.

            for ($i = 1; $i <= $meals_count; $i++) {
                $meals_selected_array["meal_id_" . $i] = "Unique ID";
                $meals_selected_array["meal_code_" . $i] = "Meal Name";
                $meals_selected_array["meal_type_" . $i] = "Meal";
            }

            //once our secondary array, which will be used as the primary array's key value, is ready, we will start defining/populating our Primary Multidimensional Array with Keys Named based on `$days_served`.
            $total_meals_array["Day " . $y] = $meals_selected_array;
        }
    }
}

就是这样!我们的动态多维数组已经准备就绪,可以通过下面的代码简单地查看:

print "<pre>";
print_r($total_meals_array);
print "</pre>";

谢谢大家,特别是@yarwest 好心回答我的问题。