【发布时间】:2016-02-25 21:58:41
【问题描述】:
我将首先展示一个非递归示例
非递归示例
$given_key_name = 'site_id';
$rows[] = array(
'site_id' => '0',
'language_id' => '1',
'name' => 'sitename',
'description' =>'site desc',
);
$results = array();
foreach($rows as $row){
$key_value = $row[$given_key_name];
unset($row[$given_key_name]);
$results[$key_value] = $row;
}
// OR This method is faster than the forloop
$results = array_combine(array_column($rows, $given_key_name),$rows);
foreach($results as &$row){
unset($row[$given_key_name]);
}
$results等于
$results[0] = array(
'language_id' => '1',
'name' => 'sitename',
'description' =>'site desc',
);
很简单,键名已设置为给定子元素的值。但我希望能够通过使用多个键名来嵌套和取消嵌套。
例子
$given_key_names = array('site_id', 'language_id');
在这种情况下,所需的结果将是。
$results[0][1] = array(
'name' => 'sitename',
'description' =>'site desc',
);
说明
第一个键值已用作 $results 数组中的第一个键,并创建了一个新的空数组作为其值。 $results[0] = array();
由于有第二个键,它的值被设置为新创建的数组的键,它的值也是一个新的空数组。 $results[0][1] = array();
由于没有更多的键,空数组将填充剩余的值
$results[0][1] = array(
'name' => 'sitename',
'description' =>'site desc',
);
所以我想要两个函数 nestByKeyNames 和 unNestByKeyName。
NestByKeyNames 函数
function nestByKeyNames($arrayRows, $arrayKeyOrder){
// Prepare resulting array
$arrayResult = array();
// Cycle the input array
foreach($arrayRows as $someRow){
// We will acomplish this using references
$current = &$arrayResult;
// get the current level
foreach($arrayKeyOrder as $someKey){
$someValue = $someRow[$someKey];
if(isset($current[$someValue])){
$current = &$current[$someValue];
}else{
$current[$someValue] = array();
$current = &$current[$someValue];
}
unset($someRow[$someKey]);
}
$current = $someRow;
}
return $arrayResult;
}
我想知道是否可以使用array_combine(array_column($arrayRows, $key_name),$arrayRows); 代替第一次迭代来提高性能?
这表示 mysql select 语句的结果。
$rows = array(
array(
'pri_id_1' =>1,
'pri_id_2' =>1,
'pri_id_3' =>1,
'col_1' =>'col_value_1111',
'col_2' =>'col_value_1112',
'col_3' =>'col_value_1113',
),
array(
'pri_id_1' =>1,
'pri_id_2' =>2,
'pri_id_3' =>1,
'col_1' =>'col_value_1211',
'col_2' =>'col_value_1212',
'col_3' =>'col_value_1213',
),
array(
'pri_id_1' =>1,
'pri_id_2' =>3,
'pri_id_3' =>1,
'col_1' =>'col_value_1311',
'col_2' =>'col_value_1312',
'col_3' =>'col_value_1313',
)
);
$keyNames = array('pri_id_1','pri_id_2','pri_id_3');
$results = nestByKeyNames($rows, $keyNames);
产生以下输出
Array
(
[1] => Array
(
[1] => Array
(
[1] => Array
(
[col_1] => col_value_1111
[col_2] => col_value_1112
[col_3] => col_value_1113
)
)
[2] => Array
(
[1] => Array
(
[col_1] => col_value_1211
[col_2] => col_value_1212
[col_3] => col_value_1213
)
)
[3] => Array
(
[1] => Array
(
[col_1] => col_value_1311
[col_2] => col_value_1312
[col_3] => col_value_1313
)
)
)
)
UnNestByKeyNames 函数
unNestByKeyNames 应该能够获取此输出并将其转换回原始数组,前提是为其提供键名。 Christians Answer 没有解决这个问题,因为它不能使用单个键名,但我可以说它非常接近。
function unNestByKeyNames($arrayRows, $arrayKeyOrder){
}
$keyNames = array('pri_id_1','pri_id_2','pri_id_3');
$rows = unNestKeyNames($results, $keyNames);
我的真正目标是从 MYSQL SELECT 语句中获取结果,并使用 nestByKeyNames 使用相同的命名约定填充表单。
例如
<input name="rows[1][1][1][col_1]" value="col_value_1" />
然后首先使用unNestByKeyNames 将$_POST 请求转换回MYSQL INSERT 语句。
据此,我将创建一个INSERT 语句。
function returnValues($rows, $column_names){
//validation has been removed for clarity
$implode_VALUES = array();
foreach ($rows as $key => $row) {
$implode_row_values = array();
foreach ($column_names as $column_name) {
$implode_row_values[$column_name] = $row[$column_name];
}
if($implode_row_values){
$implode_VALUES[] = " ('" . implode("','", $implode_row_values) . "') ";
}
}
return $implode_VALUES;
}
$implode_COLUMNS = array('pri_id_1','pri_id_2','pri_id_3','col_1','col_2','col_3');
$implode_VALUES = returnValues($rows, $implode_COLUMNS)
$sql = "INSERT INTO table_name (" . implode(',', $implode_COLUMNS) . ") VALUES " . implode(',', $implode_VALUES);
最终结果应该会产生这样的sql语句
INSERT INTO table_name (pri_id_1,pri_id_2,pri_id_3,col_1,col_2,col_3) VALUES ('1','1','1','NEW_value_1111','NEW_value_1112','NEW_value_1113') , ('1','2','1','NEW_value_1211','NEW_value_1212','NEW_value_1213') , ('1','3','1','NEW_value_1311','NEW_value_1312','NEW_value_1313')
我想要什么
- 关于“nestByKeyNames”功能的改进建议(性能/是否有错误)
- 帮助生成“unNestByKeyNames”代码
- 关于我的“$rows to mysql INSERT”方法的改进建议
- 如何让我的任何代码执行得更好的示例。
【问题讨论】:
标签: php arrays recursion multidimensional-array pass-by-reference