Вот один из способов: lodash
:
var testArr = [{"Attr":[{"power":{"p1":"str","t3":"str"},"light":[{"test":"str"},{"test2":[{"t4":"str"}]}]}]},{"Attr1":[{"power1":{"p2":"str","t5":"str"},"light1":[{"test3":"str"},{"test_x":[{"t_x":"str"},{"t_y":[{"t_y1":"str"}]}]}]}]}];
var findStr = function(o) {
return _(o)
.map(function(v, k) {
return v === 'str'
? k
: _.isObject(v) ? findStr(v) : null;
})
.compact()
.flatten()
.value();
};
console.log(findStr(testArr));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
Зачем создавать другой массив? Вы можете реально редактировать массив, который у вас уже есть. Например: Вы получаете индексированный массив из базы данных. Заполните форму значениями, чтобы пользователь мог видеть старую информацию. Когда пользователь редактирует, скажем, его имя Зачем создавать другой массив? Вы можете реально редактировать массив, который у вас уже есть. Например: Вы получаете индексированный массив из базы данных. Заполните форму значениями, чтобы пользователь мог видеть старую информацию. Когда пользователь редактирует, скажем, его имя [110] myArray ['name'] =
Я надеюсь, что понимаю ваш вопрос (если хотите, оставьте комментарий).
Если вы хотите иметь массив форм в качестве основных значений и только в том случае, если он пуст, принимает значение из второго массива, вы можете использовать комбинацию на array_filter
и array_merge
.
Рассмотрим следующий пример:
$form = array("km_user_first_name" => "Alice", "km_user_address" => "");
$row = array("km_user_first_name" => "Boby", "km_user_address" => "via pola");
$res = array_merge($row, array_filter($form));
Это выдаст:
Array
(
[km_user_first_name] => Alice
[km_user_address] => via pola
)
Я знаю, что я использую массив form
второй, как сказано в документации PHP [115 ] (спасибо @Nick):
Если входные массивы имеют одинаковые строковые ключи, то более позднее значение для этого ключа будет перезаписывать предыдущее
blockquote>Надеюсь, что помогает!
Я хочу дать второй ответ с совершенно другим подходом.
Вероятно, лучший и наиболее безопасный способ сделать это - просто выполнить простой статический подготовленный оператор и разрешить обработку пустых параметров вплоть до SQL:
$sql_update = <<<_SQL_
UPDATE
`users`
SET
`km_user_first_name` = COALESCE(NULLIF(?, ''), `km_user_first_name` ),
`km_user_last_name` = COALESCE(NULLIF(?, ''), `km_user_last_name` ),
`km_user_address` = COALESCE(NULLIF(?, ''), `km_user_address` ),
`km_user_city` = COALESCE(NULLIF(?, ''), `km_user_city` ),
`km_user_city_prov` = COALESCE(NULLIF(?, ''), `km_user_city_prov` ),
`km_user_postcode` = COALESCE(NULLIF(?, ''), `km_user_postcode` ),
`km_user_email` = COALESCE(NULLIF(?, ''), `km_user_email` ),
`km_user_website` = COALESCE(NULLIF(?, ''), `km_user_website` ),
`km_user_telephone` = COALESCE(NULLIF(?, ''), `km_user_telephone` ),
`km_user_mobile` = COALESCE(NULLIF(?, ''), `km_user_mobile` ),
`km_user_fiscalcode` = COALESCE(NULLIF(?, ''), `km_user_fiscalcode` ),
`km_user_document` = COALESCE(NULLIF(?, ''), `km_user_document` ),
`km_user_document_number` = COALESCE(NULLIF(?, ''), `km_user_document_number` ),
`km_user_document_exp` = COALESCE(NULLIF(?, ''), `km_user_document_exp` ),
`km_user_birth_place` = COALESCE(NULLIF(?, ''), `km_user_birth_place` ),
`km_user_birth_date` = COALESCE(NULLIF(?, ''), `km_user_birth_date` )
WHERE
`user_id` = ?
;
_SQL_;
$stmt = $db_user_conn->prepare($sql_update);
mysqli_stmt_bind_param
(
$stmt, 'ssssssssssssssssi',
$form_data['km_user_first_name'],
$form_data['km_user_last_name'],
$form_data['km_user_address'],
$form_data['km_user_city'],
$form_data['km_user_city_prov'],
$form_data['km_user_postcode'],
$form_data['km_user_email'],
$form_data['km_user_website'],
$form_data['km_user_telephone'],
$form_data['km_user_mobile'],
$form_data['km_user_fiscalcode'],
$form_data['km_user_document'],
$form_data['km_user_document_number'],
$form_data['km_user_document_exp'],
$form_data['km_user_birth_place'],
$form_data['km_user_birth_date'],
$km_user_id
);
mysqli_stmt_execute($stmt);
Вы должны положиться на подготовленные заявления.
Создавайте имена столбцов только с использованием белого списка в качестве динамического SQL. Отфильтруйте пустые строки ''
. Вставьте анонимные подготовленные параметры оператора ?
и сгенерируйте строку спецификатора типа. Затем передайте значения в качестве связанных параметров.
Это должно сработать (пока не смог проверить).
<?php
declare (strict_types=1);
$km_user_id = 2;
// this array comes from the form
$form_array =
[
'km_user_first_name' => 'Antonio',
'km_user_last_name' => 'Acri',
'km_user_address' => 'via pola',
'km_user_city' => 'roma',
'km_user_city_prov' => '',
'km_user_postcode' => '',
'km_user_email' => '',
'km_user_website' => 'url',
'km_user_telephone' => '123456',
'km_user_mobile' => '',
'km_user_fiscalcode' => '',
'km_user_document' => '',
'km_user_document_number' => '',
'km_user_document_exp' => '',
'km_user_birth_place' => '',
'km_user_birth_date' => '',
];
$white_list =
[
'DEBUGkm_user_first_name' => true, // DEBUG TEST filter
'km_user_last_name' => true,
'km_user_address' => true,
'km_user_city' => true,
'km_user_city_prov' => true,
'km_user_postcode' => true,
'km_user_email' => true,
'km_user_website' => true,
'km_user_telephone' => true,
'km_user_mobile' => true,
'km_user_fiscalcode' => true,
'km_user_document' => true,
'km_user_document_number' => true,
'km_user_document_exp' => true,
'km_user_birth_place' => true,
'km_user_birth_date' => true,
];
// filter by whitelist and remove '' but NOT '0'
$non_empty = array_intersect_key(array_filter($form_array, function($v){return $v !== '';}), $white_list);
if(!empty($non_empty))
{
$cols = '`' . implode('` = ?, `', array_keys($non_empty)) . ' = ?';
$query = "UPDATE `users` SET $cols WHERE `user_id` = ?";
$values = array_values($non_empty);
array_push($values, $km_user_id);
$stmt = mysqli_prepare($db_user_conn, $query);
mysqli_stmt_bind_param($stmt, str_repeat('s', count($non_empty)).'i', ...$values);
mysqli_stmt_execute($stmt);
// TODO: error handling
}
km_user_first_name
не следует обновлять, поскольку его нет в белом списке. Удалите префикс DEBUG
при тестировании.