【问题标题】:Create Multidimensional Array in PHP with Dynamic Data使用动态数据在 PHP 中创建多维数组
【发布时间】:2017-01-09 21:17:58
【问题描述】:

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

餐厅提供不同的套餐。每个包裹每天包含若干份。例如,套餐 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
        )

)

【问题讨论】:

  • 只是澄清一下,服务天数可以改变吗?或者是为每个包设置的东西?
  • 他们可以改变。例如,“套餐 A”每月提供 10 天,每天提供 3 份,而“套餐 B”每月提供 20 天,每天提供 2 份。
  • 所以是每个包裹的固定天数?点“套餐A”的人,10天送餐?
  • 为什么不使用普通的索引数组,索引从 0 到 19 以防 20 天,然后子数组索引为 0 到 2(当天 3 份时)?这是更常见的方法。
  • @yarwest 是正确的。选择“套餐A”的每个人都将获得10天的食物。

标签: php for-loop associative-array


【解决方案1】:

重要提示

使用mysqli 函数是非常不安全的。它们可以很容易地被操纵,例如,SQL 注入。请改用PDOPrepared 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
            );
        }           
    }
}

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

【讨论】:

  • 您的建议让我离我真正想要的东西更近了一步。非常感谢。由于我还没有得到最终结果,因此需要一些时间来测试和投票这个答案。如果需要,我还将根据此建议编辑我的问题。
  • @MohammedAkhtarZuberi 很高兴能提供一些帮助。如果这不能回答问题,请尝试让您的问题更清楚一点。
  • 根据您的建议检查我修改后的问题。你能帮我得到最终的输出吗?
【解决方案2】:

现在这里是在给定情况下效果最好的代码。

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

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

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

预期的输出类似于:

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 好心回答我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    相关资源
    最近更新 更多