Как объединить два массива

Вот один из способов: 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>

0
задан Quasimodo's clone 19 January 2019 в 21:53
поделиться

4 ответа

Зачем создавать другой массив? Вы можете реально редактировать массив, который у вас уже есть. Например: Вы получаете индексированный массив из базы данных. Заполните форму значениями, чтобы пользователь мог видеть старую информацию. Когда пользователь редактирует, скажем, его имя myArray ['name'] =

Зачем создавать другой массив? Вы можете реально редактировать массив, который у вас уже есть. Например: Вы получаете индексированный массив из базы данных. Заполните форму значениями, чтобы пользователь мог видеть старую информацию. Когда пользователь редактирует, скажем, его имя [110]

POST ['name']

0
ответ дан Mouad Khali 19 January 2019 в 21:53
поделиться

Я надеюсь, что понимаю ваш вопрос (если хотите, оставьте комментарий).

Если вы хотите иметь массив форм в качестве основных значений и только в том случае, если он пуст, принимает значение из второго массива, вы можете использовать комбинацию на 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):

Если входные массивы имеют одинаковые строковые ключи, то более позднее значение для этого ключа будет перезаписывать предыдущее

Надеюсь, что помогает!

0
ответ дан dWinder 19 January 2019 в 21:53
поделиться

Я хочу дать второй ответ с совершенно другим подходом.

Вероятно, лучший и наиболее безопасный способ сделать это - просто выполнить простой статический подготовленный оператор и разрешить обработку пустых параметров вплоть до 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);
0
ответ дан Quasimodo's clone 19 January 2019 в 21:53
поделиться

Вы должны положиться на подготовленные заявления.

Создавайте имена столбцов только с использованием белого списка в качестве динамического 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 при тестировании.

0
ответ дан Quasimodo's clone 19 January 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: