Начну с отображения нерекурсивного примера
Нерекурсивный пример
$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);
использоваться вместо первой итерации для повышения производительности?
Это результат результатов инструкции select mysql.
$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 должны иметь возможность принимать этот вывод и преобразовывать его обратно в исходный массив, предоставляя ему имена ключей. Ответ христианам не решал это, так как он не работает с одним ключевым именем, но я могу сказать, что он очень близко.
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" />
а затем преобразовать запрос $_POST обратно в инструкцию MYSQL INSERT
, сначала используя unNestByKeyNames
.
Из этого я создам оператор 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"
- примеры того, как я мог бы сделать любой из моих кодов более эффективным.