使用动态数据在 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
);
}
}
}
这将根据指定的结构创建一个完全空的数组。
现在这是在给定情况下最有效的代码。
情况
订购单是多页的,具体取决于基于所选包裹的服务天数。每个包的详细信息都存储在数据库中,字段如下:
- package_id(唯一字段)
- package_name(包的名称,例如包 A)
- servings_count(一天总份数)
- 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 好心回答我的问题。
我正在为一家按月提供食物的餐厅准备菜单系统。这是我的问题:
餐厅提供不同的套餐。每包每天包含若干份。例如,套餐 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
);
}
}
}
这将根据指定的结构创建一个完全空的数组。
现在这是在给定情况下最有效的代码。
情况
订购单是多页的,具体取决于基于所选包裹的服务天数。每个包的详细信息都存储在数据库中,字段如下:
- package_id(唯一字段)
- package_name(包的名称,例如包 A)
- servings_count(一天总份数)
- 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 好心回答我的问题。