【问题标题】:PHP - Renumbering Array Keys After Unsetting Value [duplicate]PHP - 取消设置值后重新编号数组键[重复]
【发布时间】:2015-02-01 20:06:48
【问题描述】:

我使用 PHP 数组来存储用户在网站上关注的所有人的数据。这是我如何设置的示例:

$data = array(
    ['user1'] => array(
        [0] => 'somedata',
        [1] => 'moredata',
        [2] => array(
            [0] => 'Jim',
            [1] => 'Bob',
            [2] => 'Nick',
            [3] => 'Susy',
        )
    ),
);

如您所见,$data[user][2] 列出了所有朋友。该数组具有与键 [0] 和 [1] 完全相同的外观,因为 var_export() 就是这样做的。现在我的问题是这个。当有人取消关注某人时,我使用 unset() 从数组中删除该朋友。因此,如果我想在上面的示例中取消关注 Bob,将留下 Jim、Nick 和 Susy。

现在唯一的问题是数组键在重命名时无法正确重新编号。因此,一旦 Bob 离开,它会从 0 变为 2,而不是 Nick 使用 1 的数组键。现在我可以自己想办法做到这一点,但我非常希望有一些 PHP 函数专门用于解决这个问题,即就是,将这些数组键重命名为正确的数字顺序。我检查了 sort() 函数,但这似乎是按字母顺序排列数组值而不是键。

【问题讨论】:

  • 您正在使用 var_export() 并将数组保存到磁盘或类似文件中,而不是将其存储在数据库中?

标签: php


【解决方案1】:

你可以使用 array_splice

$removedElement = array_splice($data['user1'][2], $indexOfUserToRemove, 1);

这会改变原来的数组,重新索引它,但前提是数组的键是数字的。

【讨论】:

  • 我也会研究这个,看看哪个(这个或另一个帖子)效果更好。谢谢!
【解决方案2】:

如果您只想在该级别重新索引数组,您可以简单地使用 array_values();

例如,假设您要删除“bob”条目,只需在删除后调用 bob 正上方级别的 array_values 即可。

unset($data['user1'][2][1]);
$data['user1'][2] = array_values($data['user1'][2]);

【讨论】:

    【解决方案3】:

    我会像这样使用array_values

    $data['user1'][2]=array_values($data['user1'][2]);

    这是完整的代码:

    $data = array(
        'user1' => array(
            'somedata',
            'moredata',
            array(
                'Jim',
                'Bob',
                'Nick',
                'Susy',
            )
        ),
    );
    
    unset($data['user1'][2][1]);
    var_export ($data['user1'][2]);
    
    echo "\n\n";
    $data['user1'][2]=array_values($data['user1'][2]);
    
    var_export($data['user1'][2]);
    

    结果

    array (
      0 => 'Jim',
      2 => 'Nick',
      3 => 'Susy',
    )
    
    array (
      0 => 'Jim',
      1 => 'Nick',
      2 => 'Susy',
    )
    

    在这里查看它的实际效果: Sandbox

    【讨论】:

      【解决方案4】:

      您可以使用array_values 以数字方式重新索引数组。

      $newArray = array_values($array);
      

      【讨论】:

        猜你喜欢
        • 2011-08-22
        • 1970-01-01
        • 2021-08-02
        • 2013-01-31
        • 2014-09-29
        • 1970-01-01
        • 2021-12-02
        • 2012-12-18
        • 2018-10-27
        相关资源
        最近更新 更多