如何使用php删除数组中的特定键?

zec*_*ude 10 php arrays

我有一个包含4个值的数组.我想删除第二个位置的值,然后将其余的键向下移一个.

$b = array(123,456,789,123);
Run Code Online (Sandbox Code Playgroud)

在第二个位置卸下钥匙之前:

数组([0] => 123 [1] => 456 [2] => 789 [3] => 123)

在我希望其余的键向下移动一个以填充缺失键的空间之后

数组([0] => 123 [1] => 789 [2] => 123)

我尝试在特定键上使用unset(),但它不会向下移动剩余的键.如何使用php删除数组中的特定键?

mic*_*usa 10

它表示您的输入数据是一个索引数组(从零开始的整数键序列中没有间隙)。我将比较直接从 OP 示例数据提供所需结果的明显技术。

1.unset()然后array_values()

unset($b[1]);
$b = array_value($b);
Run Code Online (Sandbox Code Playgroud)
  • 这是可以安全使用的,无需检查索引是否存在——如果丢失,也不会出现错误。
  • unset()可以接收多个参数,因此如果需要删除更多元素,则函数调用次数保持不变。例如unset($b[1], $b[3], $b[5]);
  • unset()不能嵌套在其中array_values()形成单行,因为unset()修改变量并且不返回任何值。
  • AFAIK,unset()使用动态白名单/黑名单键删除元素并不是特别方便。

2.array_splice()

array_splice($b, 1, 1);
//          (input array, starting position, number of elements to remove)
Run Code Online (Sandbox Code Playgroud)
  • 该函数与键无关,它将根据元素在数组中的位置来定位元素。这可以安全使用,无需检查位置是否存在——如果丢失,也不会出现错误。
  • array_splice()可以删除单个元素,或者最多删除多个连续的元素元素。如果需要删除不连续的元素,则需要进行其他函数调用。
  • array_splice()不需要array_values()调用,因为“输入中的数字键不会被保留”——在某些情况下这可能是需要的,也可能是不需要的。

3.array_filter()嵌套在array_values()

array_values(
    array_filter(
        $b,
        function($k) {
            return $k != 1;
        },
        ARRAY_FILTER_USE_KEY
    )
)
Run Code Online (Sandbox Code Playgroud)
  • 该技术依赖于自定义函数调用和一个标志来告诉过滤器仅迭代键。
  • 它将是一个相对较差的性能,因为它迭代所有元素,而不管逻辑上的必要性。
  • 这是我将讨论的最详细的选项。
  • 如果您想in_array()在自定义函数中使用带有白名单/黑名单键的调用,它会进一步降低效率。
  • 在 PHP7.4 之前,将白名单/黑名单/变量传递到自定义函数作用域将需要使用use().
  • 它可以写成一行行。
  • 这是可以安全使用的,无需检查索引是否存在——如果丢失,也不会出现错误。

4.array_diff_key()嵌套在array_values()

array_values(
    array_diff_key(
        $b,
        [1 => '']
    )
);
Run Code Online (Sandbox Code Playgroud)
  • 这种技术并不是非常冗长,但如果您只需要删除一个元素,那么它就有点大材小用了。
  • array_diff_key()当存在白名单/黑名单键数组(可能有不同的元素计数)时,它真的很闪耀。PHP 处理按键的速度非常快,因此该函数在完成其设计任务时非常高效。
  • 数组中被声明为第二个参数的值array_diff_key()是完全不相关的——它们可以是nullor999'eleventeen'——只考虑键。
  • array_diff_key()与 相比,不存在任何范围界定挑战array_filter(),因为没有调用自定义函数。
  • 它可以写成一行行。
  • 这是可以安全使用的,无需检查索引是否存在——如果丢失,也不会出现错误。


Sim*_*one 6

您需要array_values($b)重新键入数组,以便键是顺序和数字(从0开始).

以下应该做的伎俩:

$b = array(123,456,789,123);
unset($b[1]);
$b = array_values($b);
echo "<pre>"; print_r($b);
Run Code Online (Sandbox Code Playgroud)