Почему мой ключ верхнего уровня изменяется, когда я сбрасываю элемент? - PullRequest
0 голосов
/ 09 января 2019

Я близок к завершению написания кода для плагина, который позволяет администратору добавлять пользовательские данные в базу данных SQL 'custom_tokens'. Поскольку плагин допускает несколько «токенов», я хочу, чтобы он был упорядочен следующим образом («enu» можно рассматривать как категорию токенов, если хотите):

[enu] => Array (
    [0] => Array (
        [name] => Enumivo
        [contract] => enu.token
        [symbol] => ENU
        [logo] => 
        )
    [1] => Array (
        [name] => Eurno
        [contract] => token.eurno
        [symbol] => ENO
        [logo] => 
        )
    )

Все это хорошо работает для сохранения токенов (у меня есть PHP, чтобы проверить, есть ли токен в этой категории и, если его нет, создать категорию. Если есть, просто добавьте к нему.

Проблема с удалением записей. До того, как сделать его вложенным массивом, он работал нормально - маркер, который вы выбрали для удаления, был бы удален, а массив переставлен - но теперь я добавил верхний уровень, с которым я столкнулся, в следующей проблеме: например, при удалении «Eurno» также переименует клавишу верхнего уровня («enu») в число. Пример массива после удаления выглядит следующим образом:

[0] => Array (
    [name] => Enumivo
    [contract] => enu.token
    [symbol] => ENU
    [logo] => 
    )

Желаемый результат будет:

[enu] => Array (
    [name] => Enumivo
    [contract] => enu.token
    [symbol] => ENU
    [logo] => 
    )

Код, который я считаю проблематичным, выглядит следующим образом:

// Get array //
$cur_tokens = get_option('custom_tokens');

// Set the nest to look in //
$cur_tokens = $cur_tokens['enu'];

// Initialise the loop //
foreach ($cur_tokens as $key => $cur) {

  // Check which item has been selected for deletion //
  if(isset($_POST['token-'.$key])) {

    // Unset it //
    unset($cur_tokens[$key]);

    // Update the database //
    update_option( 'custom_tokens', $cur_tokens );
  }
}

Любая помощь очень ценится. Я уже пытался добиться этого, установив ключ в null, а затем выполнив array_filter (), но вернул те же результаты.

Я знаю, что это, вероятно, что-то глупое, как всегда.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Огромное спасибо всем, кто помог мне, особенно @misorude!

Именно их ответ помог решить проблему. Кажется, проблема была вызвана сочетанием того, что сказал Мисоруде (редактирование цикла, в котором я сейчас нахожусь) и определения дополнительного ключа в переменной $ cur_tokens. Я также вынул вызов update_options из цикла.

Рабочий код PHP выглядит следующим образом:

  $cur_tokens = get_option('custom_tokens');
  if(isset($_POST['token'])) {
  $arr = $_POST['token'];
  foreach ($arr as $key => $cur) {
      unset($cur_tokens['enu'][$key]);
    }
    update_option( 'custom_tokens', $cur_tokens );
  }

И отредактированный HTML-код:

name="token['.$key.']"

Как объяснил Мисоруде, размещение выбранных токенов в их собственном массиве, похоже, добилось цели.

Большое спасибо всем за помощь.

0 голосов
/ 09 января 2019

Кажется, с кодом что-то не так. Мне также кажется, что вы сбрасываете неправильный массив. Вам нужно дважды использовать foreach, чтобы сбросить массив. Потому что это многомерно. Поэтому, если вы хотите, чтобы он исчез, вам нужно удалить второй ключ из массива, который в данном случае равен 0 или 1.

foreach ($cur_tokens as $key => $cur) {
    foreach($cur as $token_key =>$row){

         if(isset($_POST['token-'.$token_key])) {
         unset($row[0]);

    }
  }
}

Массив будет выглядеть примерно так:

[enu] => Array (
    [1] => Array (
        [name] => Eurno
        [contract] => token.eurno
        [symbol] => ENO
        [logo] => 
        )
    )

это псевдокод, но я надеюсь, что вы поймете идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...