取消设置元素时,为什么我的顶级键被更改了?

时间:2019-01-09 13:16:01

标签: php arrays nested

我的插件编码即将结束,它允许管理员将自定义数据添加到SQL DB'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来检查该类别中是否已经有令牌,如果没有,则创建该类别。如果有,则将其追加。< / p>

问题在于删除条目。在将其制作为嵌套数组之前,它可以正常工作-您选择删除的令牌将被删除,数组将被重新洗牌-但现在我添加了顶层,我遇到了以下问题:例如,删除时, “ 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 :(得分:0)

代码似乎有很多错误。在我看来,您正在设置错误的数组。您需要在此处使用两次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] => 
        )
    )

这是一个伪代码,但希望您能理解。

答案 1 :(得分:0)

感谢所有帮助过我的人,尤其是@misorude!

他们的回答帮助解决了问题。看来这个问题是由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.']"

正如Misorude所解释的那样,将选定的令牌放置在自己的数组中似乎可以解决问题。

非常感谢您的帮助。