在PHP中从一个数组中删除一个元素

回答 27 浏览 344.6万 2008-12-15

有没有一种简单的方法可以用PHP从数组中删除一个元素,从而使foreach ($array)不再包括该元素?

我以为把它设置为null就可以了,但显然它不起作用了。

Ben 提问于2008-12-15
我不认为Konrad的答案是解决上述问题的最简单方法。在unset()的情况下,数组上的迭代将不再包括被删除的值。另外,Stevan的答案确实很充分,实际上,这也是我要找的答案--但不是OP :)brandizzi 2012-07-26
@danip 在手册中容易找到并不排除在StackOverflow上有问题。如果这个问题是一个重复的StackOverflow问题,那么它可能不属于这里。StackOverflow是一个寻找答案的好地方,即使是在查找手册之前,也可以作为一个选择。Dan Nissenbaum 2014-02-11
@unset($array[$key]); $array = array_values($array);trojan 2014-09-04
如果你想从数组的数组(关联数组)中移除键,请参见stackoverflow.com/a/47978980/1045444中的解决方案。Somnath Muluk 2017-12-26
你可以在一个foreach循环中这样做。pastefs.com/pid/130950Aurangzeb 2019-06-25
27 个回答
#1楼 已采纳
得票数 3440

有不同的方法来删除一个数组元素,其中有些方法对于某些特定的任务比其他方法更有用。

删除一个单一的数组元素

如果你想只删除一个数组元素,你可以使用unset()或者\array_splice()来删除。

如果你知道值而不知道删除元素的键,你可以使用\array_search()来获得键。这只在该元素不出现多次的情况下有效,因为\array_search只返回第一次命中。

unset()

注意,当你使用unset()时,数组的键不会改变。如果你想对键值进行重新索引,你可以在unset()之后使用\array_values(),这将把所有键值转换为从0开始的数字枚举键。

代码:C

$array = [0 => "a", 1 => "b", 2 => "c"];
unset($array[1]);
          // ↑ Key which you want to delete

输出。

[
    [0] => a
    [2] => c
]

\array_splice()方法

如果你使用\array_splice(),键将自动被重新索引,但关联键不会改变--与\array_values()相反,它将把所有的键转换为数字键。

\array_splice()需要offset,而不是key,作为第二个参数。

代码:C

$array = [0 => "a", 1 => "b", 2 => "c"];
\array_splice($array, 1, 1);
                   // ↑ Offset which you want to delete

输出。

[
    [0] => a
    [1] => c
]

array_splice(),与unset()相同,通过引用来获取数组。你不会把这些函数的返回值分配回数组。

删除多个数组元素

如果你想删除多个数组元素,又不想多次调用unset()\array_splice(),你可以使用函数\array_diff()\array_diff_key(),这取决于你是否知道你要删除的元素的值或键值。

\array_diff()方法

如果你知道你想删除的数组元素的值,那么你可以使用\array_diff()。和之前的unset()一样,它不会改变数组的键。

代码:C

$array = [0 => "a", 1 => "b", 2 => "c", 3 => "c"];
$array = \array_diff($array, ["a", "c"]);
                          // └────────┘
                          // Array values which you want to delete

输出。

[
    [1] => b
]

\array_diff_key()方法

如果你知道你要删除的元素的键,那么你要使用\array_diff_key()。你必须确保你在第二个参数中把键作为键传递,而不是作为值。键值不会重新索引。

代码:C

$array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_diff_key($array, [0 => "xy", "2" => "xy"]);
                               // ↑           ↑
                               // Array keys which you want to delete

输出。

[
    [1] => b
]

如果你想使用unset()\array_splice()来删除具有相同值的多个元素,你可以使用\array_keys()来获得一个特定值的所有键,然后删除所有的元素。

\array_filter()方法

如果你想删除数组中所有具有特定值的元素,你可以使用\array_filter()

代码:C

$array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_filter($array, static function ($element) {
    return $element !== "b";
    //                   ↑
    // Array value which you want to delete
});

输出。

[
    [0] => a
    [1] => c
]
Rizier123 提问
Rizier123 修改于2022-03-23
@AlexandruRada 不,你说的是 "不要使用这个"--这简直是胡说八道。当你把一个数组当作它是什么时,你可以安全地使用这个方法--一个字典。只有当你期待连续的数字索引时,你才需要使用其他方法。Konrad Rudolph 2012-06-13
@AlexandruRada 你不可能有array (3) { [0]=>int(0) ...,当你unset($x[2])$x = array(1, 2, 3, 4);结果必须var_dump($x); // array(3) { [0]=> int(1) [1]=> int(2) [3]=> int(4) }(这可能是打错了)。inemanja 2016-04-19
unset可以有多个参数。void unset ( mixed $var [, mixed $... ] ).Константин Ван 2017-04-14
array_filter也是一种可行的方法。特别是如果你不想突变数组,它也不会重新索引,这可能是json_encode的一个问题。php.net/manual/en/function.json-encode.php#94157dotnetCarpenter 2017-05-06
unset不是一个函数,而是一个语言结构(和一个关键字)。它必须也不能以``为前缀。hvertous 2019-12-03
#2楼
得票数 1410

需要注意的是,unset()将保持索引不变,这是在使用字符串索引(数组为hashtable)时你所期望的,但在处理整数索引数组时,可能会相当令人惊讶。

$array = array(0, 1, 2, 3);
unset($array[2]);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [3]=>
  int(3)
} */

$array = array(0, 1, 2, 3);
array_splice($array, 2, 1);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
} */

因此,如果你想使你的整数键正常化,可以使用array_splice()。另一个选择是在unset()之后使用array_values()

$array = array(0, 1, 2, 3);

unset($array[2]);
$array = array_values($array);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
} */
Stefan Gehrig 提问于2008-12-15
Ry- 修改于2012-01-13
值得注意的是,当你使用array_splice()时,你需要知道OFFSET,而不是键,而是你想删除的任何元素的偏移量(!)Tom 2012-06-08
@Tom:对于一个普通的数组(连续的整数索引),偏移量就是索引。这就是array_splice有意义的地方(包括其他)。Stefan Gehrig 2012-06-09
是的,但只是要记住,如果你在使用splice之前篡改了数组Tom 2012-06-09
从一个基本的测试来看,从一个巨大的数组中删除大量的元素,array_splice似乎要快得多,对内存的消耗也少。这与我所期望的一致:array_values()似乎是在制作一个数组的副本,而array_splice则是在原地工作。Doug Kavendek 2014-12-01
array_values是一种有用的方法,当你在一个循环中移除元素,并希望索引保持一致,但又希望在循环之后将其压缩掉。Rorrik 2015-06-02
#3楼
得票数 412
  // Our initial array
  $arr = array("blue", "green", "red", "yellow", "green", "orange", "yellow", "indigo", "red");
  print_r($arr);

  // Remove the elements who's values are yellow or red
  $arr = array_diff($arr, array("yellow", "red"));
  print_r($arr);

这是上述代码的输出结果。

Array
(
    [0] => blue
    [1] => green
    [2] => red
    [3] => yellow
    [4] => green
    [5] => orange
    [6] => yellow
    [7] => indigo
    [8] => red
)

Array
(
    [0] => blue
    [1] => green
    [4] => green
    [5] => orange
    [7] => indigo
)

现在,array_values()可以很好地重新索引一个数字数组,但它会从数组中删除所有的键的字符串,并将其替换为数字。如果你需要保留键名(字符串),或者在所有键都是数字的情况下重新索引数组,请使用array_merge()。

$arr = array_merge(array_diff($arr, array("yellow", "red")));
print_r($arr);

输出物

Array
(
    [0] => blue
    [1] => green
    [2] => green
    [3] => orange
    [4] => indigo
)
Marcel Cozma 提问于2011-08-02
Peter Mortensen 修改于2019-02-19
$get_merged_values = array_merge($data['res'],$data['check_res']); 当我打印这个print_r($get_merged_values); 它显示如下。Array ( [0] => Array ( [menu_code] => 2 [menu_name] => Plant [menu_order_no] => 1 ) [1] => Array ( [menu_code] => 3 [menu_name] => Line [menu_order_no] => 2 ) )但是我需要分别用$get_merged_values['menu_code']和$get_merged_values['menu_name']来获取menu_code和menu_name的值,而不是用$get_merged_values[0][menu_code]、$get_merged_values[0][menu_name]。请帮助我如何做这个?heart hacker 2018-09-20
从问题的表述来看,它的措辞有误导性。如果你想在foreach循环中删除$arr[$i],如果有一个以上的元素具有相同的值,这将不起作用。Jed Lynch 2020-10-13
array_merge(array_diff(你节省了我的时间,感谢你提供的两个例子,1.keys are not re-indexedanother one with keys are indexed again from 0...nMohammed Sufian 2022-08-19
#4楼
得票数 232
$key = array_search($needle, $array);
if ($key !== false) {
    unset($array[$key]);
}
liamvictor 提问于2011-11-15
Peter Mortensen 修改于2019-02-19
最好能澄清一下,这个答案是针对删除一个元素的,当你知道值,但不知道键。请注意,它只删除了该值的第一个实例;要找到一个值的all键,请使用array_keysToolmakerSteve 2016-09-24
如果一个以上的元素具有相同的值,这将不会起作用。Jed Lynch 2020-10-13
#5楼
得票数 101
unset($array[$index]);
Eran Galperin 提问于2008-12-15
#6楼
得票数 71

如果你有一个数字索引数组,所有的值都是唯一的(或者它们是非唯一的,但你希望删除一个特定值的所有实例),你可以简单地使用array_diff()来删除一个匹配的元素,就像这样。

$my_array = array_diff($my_array, array('Value_to_remove'));

例如:"我是说,我是说。

$my_array = array('Andy', 'Bertha', 'Charles', 'Diana');
echo sizeof($my_array) . "\n";
$my_array = array_diff($my_array, array('Charles'));
echo sizeof($my_array);

这将显示以下内容。

4
3

在这个例子中,值为'Charles'的元素被删除了,这可以通过调用sizeof()来验证,初始数组的大小为4,而删除后的大小为3。

Robin Nixon 提问于2012-11-26
如果两个元素有相同的值,这将不会起作用。Jed Lynch 2020-10-13
#7楼
得票数 71

另外,对于一个被命名的元素。

unset($array["elementName"]);
DefenestrationDay 提问于2010-07-31
Mohammad 修改于2018-11-13
$a = array("A"=>1, "B"=>2, "C"=>"a"); print_r($a); unset($a["B"]); print_r($a); 给出(格式化)。Array ( [A] => 1 [B] => 2 [C] => a ), Array ( [A] => 1 [C] => a )DefenestrationDay 2011-06-09
似乎不能取消由字符串索引的数组元素(产生"致命错误:不能取消字符串偏移量")。我不认为这是一直存在的情况,但可以肯定的是,从PHP 5.3.10开始,可能更早。carpii 2012-04-06
@carpii PHP可以从一个关联数组中取消设置元素。当你试图对一个字符串而不是数组使用unset($var['key'])时,就会引起致命的错误。 例如。$array = array( 'test' => 'value', 'another' => 'value', ); unset($array['test' ])。// 按照预期从数组中删除"test"元素 $array = 'test'; unset($array['test']); // 引发"致命错误。不能像预期的那样取消设置字符串偏移量"。Jimbo 2013-03-20
在这里,你必须知道钥匙的名称,它'是更好的。stackoverflow.com/a/52826684/1407491Nabi K.A.Z. 2018-10-16
@Eran早在2008年就已经推荐了unset()!如果你想改进这个建议,你应该编辑那个答案。在这个多标签的页面上有太多的冗余内容!mickmackusa 2021-08-23
#8楼
得票数 38

销毁一个数组中的单个元素

unset()

$array1 = array('A', 'B', 'C', 'D', 'E');
unset($array1[2]); // Delete known index(2) value from array
var_dump($array1);

输出结果将是:。

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [3]=>
  string(1) "D"
  [4]=>
  string(1) "E"
}

如果你需要对数组进行重新索引。

$array1 = array_values($array1);
var_dump($array1);

那么,输出结果将是。

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "D"
  [3]=>
  string(1) "E"
}

将元素从数组的末端弹出 - 返回被弹出的元素的值

mixed array_pop(array &$array)

$stack = array("orange", "banana", "apple", "raspberry");
$last_fruit = array_pop($stack);
print_r($stack);
print_r('Last Fruit:'.$last_fruit); // Last element of the array

输出结果将是

Array
(
    [0] => orange
    [1] => banana
    [2] => apple
)
Last Fruit: raspberry

从一个数组中移除第一个元素(红色), - 返回被移除的元素的值

mixed array_shift ( array &$array )

$color = array("a" => "red", "b" => "green" , "c" => "blue");
$first_color = array_shift($color);
print_r ($color);
print_r ('First Color: '.$first_color);

输出结果将是:。

Array
(
    [b] => green
    [c] => blue
)
First Color: red
KTAnj 提问于2015-07-19
Peter Mortensen 修改于2016-05-25
如果是整数的话,array_shift重新索引关键项,所以它是不好的,所以你可以用这个。stackoverflow.com/a/52826684/1407491Nabi K.A.Z. 2018-10-16
array_shift()的复杂度是O(n)(由于重新编排数字索引),对于array_pop()来说,是O(1)。如何知道第一个元素的索引?只要在它的第一次迭代中启动一个foreachbreak就可以了。AmigoJack 2021-10-23
#9楼
得票数 37
<?php
    $stack = ["fruit1", "fruit2", "fruit3", "fruit4"];
    $fruit = array_shift($stack);
    print_r($stack);

    echo $fruit;
?>

输出。

[
    [0] => fruit2
    [1] => fruit3
    [2] => fruit4
]

fruit1
Saurabh Chandra Patel 提问于2013-06-11
Neha Sharma 修改于2019-09-03
注意,array_shift只能删除数组中的第一个元素。类似地,使用array_pop删除数组中的最后一个元素。Jasir 2014-07-22
答案只适用于数组的第一个元素,并没有回答一般的问题。sweisgerber.dev 2014-10-14
@sebweisgerber 你是对的,但我不认为这是个错误的答案,需要给这个答案降权。问题是删除一个元素,没有提到任何位置。Saurabh Chandra Patel 2014-10-14
这只涵盖了一个边缘案例Jed Lynch 2020-10-13
这种技术的实用性并不高 -- 如前所述。这个答案缺少其教育性解释。mickmackusa 2021-08-23
#10楼
得票数 29

如果指定了索引,那么就会出现。

$arr = ['a', 'b', 'c'];
$index = 0;    
unset($arr[$index]);  // $arr = ['b', 'c']

如果我们有价值而不是索引。

$arr = ['a', 'b', 'c'];

// search the value to find index
// Notice! this will only find the first occurrence of value
$index = array_search('a', $arr);

if($index !== false){
   unset($arr[$index]);  // $arr = ['b', 'c']
}

if的条件是必要的,因为如果没有找到indexunset()将自动删除数组的第一个元素,这不是我们想要的结果。

Ahmad Mobaraki 提问于2019-05-23
Ahmad Mobaraki 修改于2021-08-22
unset()早在几年前就已经在这个页面上推荐过多次了。array_search()unset()早在2011年就被证明了。stackoverflow.com/a/8135667/2943403 这个答案对这个页面没有增加任何新的价值。mickmackusa 2021-08-22
@mickmackusa 也许你是对的,这个答案中的所有信息都可以在其他不同的答案中找到。但也许在一个答案中针对不同的条件进行了简单的解释,可以为某人节省一些时间。Ahmad Mobaraki 2021-08-22
这是看待它的一种方式。另一种看法是,这个多标签的页面是"严重地过度充斥着多余的建议"。研究人员不得不一遍又一遍地翻阅相同的建议,以确保他们考虑到所有相关的建议。由于答案是单一和多种技术的混合体,而且许多答案说的是同一件事--研究人员的经验受到很大的损害。想象一下,如果你需要这个页面的建议。你会想读一本充满多余建议的小说吗?我不会的。mickmackusa 2021-08-22
如果你个人认为以前的答案不清楚或需要更多细节,你可以编辑这些答案,以更好地帮助研究人员,而不是发布新的答案。这意味着更好的建议分布在更少的总答案中。mickmackusa 2021-08-22
在许多情况下,我同意你的观点。但我认为编辑答案的目的是修正一些单词或小的技术性错别字,而不是扩大/改变它。总之,我自己花了一些时间来浏览所有的答案,想出了一个简单而有效的方法,并想出了这个解决方案,我觉得也许这是一个好主意,可以分享。我想它之所以得到一些支持,是因为其他人也有同样的情况,并认为这个答案简单易懂,而且涵盖了!@mickmackusaAhmad Mobaraki 2021-08-22
#11楼
得票数 27

如果你必须删除一个数组中的多个值,并且该数组中的条目是对象或结构化数据,那么array_filter()是你最好的选择。那些从回调函数返回真值的条目将被保留。

$array = [
    ['x'=>1,'y'=>2,'z'=>3], 
    ['x'=>2,'y'=>4,'z'=>6], 
    ['x'=>3,'y'=>6,'z'=>9]
];

$results = array_filter($array, function($value) {
    return $value['x'] > 2; 
}); //=> [['x'=>3,'y'=>6,z=>'9']]
spyle 提问于2016-02-18
Dharman 修改于2021-08-22
#12楼
得票数 22

如果你需要从一个关联数组中移除多个元素,你可以使用array_diff_key()(这里与array_flip()一起使用)。

$my_array = array(
  "key1" => "value 1",
  "key2" => "value 2",
  "key3" => "value 3",
  "key4" => "value 4",
  "key5" => "value 5",
);

$to_remove = array("key2", "key4");

$result = array_diff_key($my_array, array_flip($to_remove));

print_r($result);

输出。

Array ( [key1] => value 1 [key3] => value 3 [key5] => value 5 ) 
Simon 提问于2016-04-20
为什么这一点被低估了呢?Fr0zenFyr 2016-12-02
因为研究人员正在努力消费一个过度充斥着冗余答案的页面。研究人员的体验在这个规范页面上被破坏得很厉害。mickmackusa 2021-08-22
#13楼
得票数 22

关联性数组

对于关联数组,请使用unset

$arr = array('a' => 1, 'b' => 2, 'c' => 3);
unset($arr['b']);

// RESULT: array('a' => 1, 'c' => 3)

数字数组

对于数字数组,请使用array_splice

$arr = array(1, 2, 3);
array_splice($arr, 1, 1);

// RESULT: array(0 => 1, 1 => 3)

注意

对数字数组使用unset不会产生错误,但它会弄乱你的索引。

$arr = array(1, 2, 3);
unset($arr[1]);

// RESULT: array(0 => 1, 2 => 3)
John Slegers 提问于2016-03-11
Peter Mortensen 修改于2019-02-22
#14楼
得票数 21

unset() 销毁指定的变量。

在一个函数中,unset()的行为可能会有所不同,这取决于你试图销毁的变量的类型。

如果一个全局化的变量在一个函数内被unset(),只有局部变量被销毁。调用环境中的变量将保留与调用unset()前相同的值。

<?php
    function destroy_foo()
    {
        global $foo;
        unset($foo);
    }

    $foo = 'bar';
    destroy_foo();
    echo $foo;
?>

上述代码的答案将是bar

为了unset()一个函数内的全局变量。

<?php
    function foo()
    {
        unset($GLOBALS['bar']);
    }

    $bar = "something";
    foo();
?>
Ankit Aggarwal 提问于2013-07-26
Peter Mortensen 修改于2019-02-19
#15楼
得票数 19
// Remove by value
function removeFromArr($arr, $val)
{
    unset($arr[array_search($val, $arr)]);
    return array_values($arr);
}
Gigoland 提问于2016-04-02
Gigoland 修改于2018-07-30
这种仅有代码的答案并不稳定。如果目标值没有被array_search()找到,那么它的false返回值将有效地删除[0]键入的元素,这不是故意的,对输入数据是有损害的。我将敦促研究人员不要使用这个片段。mickmackusa 2021-08-22
#16楼
得票数 13

解决办法。

  1. 要删除一个元素,使用unset()
unset($array[3]);
unset($array['foo']);
  1. 要删除多个不连续的元素,也可以使用unset()
unset($array[3], $array[5]);
unset($array['foo'], $array['bar']);
  1. 要删除多个连续的元素,请使用array_splice()
array_splice($array, $offset, $length);

进一步的解释。

使用这些函数可以从 PHP 中删除对这些元素的所有引用。如果想在数组中保留一个键,但其值为空,则将空字符串赋给该元素。

$array[3] = $array['foo'] = '';

除了语法,使用unset()和为元素赋值''之间有逻辑上的区别。前者说This doesn't exist anymore,,而后者说This still exists, but its value is the empty string.

如果你处理的是数字,分配0可能是一个更好的选择。因此,如果一家公司停止了XL1000型链轮的生产,它将以下列方式更新其库存。

unset($products['XL1000']);

然而,如果它暂时用完了XL1000链轮,但计划在本周晚些时候从工厂收到一批新的货物,这就更好了。

$products['XL1000'] = 0;

如果你unset()一个元素,PHP会调整数组,使循环仍然正常工作。它并不压缩数组来填补缺失的洞。当我们说所有的数组都是关联的时候,这就是我们的意思,即使它们看起来是数字的。这里有一个例子。

// Create a "numeric" array
$animals = array('ant', 'bee', 'cat', 'dog', 'elk', 'fox');
print $animals[1];  // Prints 'bee'
print $animals[2];  // Prints 'cat'
count($animals);    // Returns 6

// unset()
unset($animals[1]); // Removes element $animals[1] = 'bee'
print $animals[1];  // Prints '' and throws an E_NOTICE error
print $animals[2];  // Still prints 'cat'
count($animals);    // Returns 5, even though $array[5] is 'fox'

// Add a new element
$animals[ ] = 'gnu'; // Add a new element (not Unix)
print $animals[1];  // Prints '', still empty
print $animals[6];  // Prints 'gnu', this is where 'gnu' ended up
count($animals);    // Returns 6

// Assign ''
$animals[2] = '';   // Zero out value
print $animals[2];  // Prints ''
count($animals);    // Returns 6, count does not decrease

为了将数组压缩成一个密集填充的数字数组,请使用array_values()

$animals = array_values($animals);

另外,array_splice()自动对数组进行重新索引,以避免留下漏洞。

// Create a "numeric" array
$animals = array('ant', 'bee', 'cat', 'dog', 'elk', 'fox');
array_splice($animals, 2, 2);
print_r($animals);
Array
(
    [0] => ant
    [1] => bee
    [2] => elk
    [3] => fox
)

如果你把数组作为一个队列,并且想从队列中移除项目,同时仍然允许随机访问,那么这就很有用。为了安全地从数组中移除第一个或最后一个元素,可以分别使用array_shift()array_pop()

Abdur Rehman 提问于2018-01-29
Peter Mortensen 修改于2019-02-22
#17楼
得票数 11

遵循默认的功能。

  • PHP:未设置

unset() 销毁指定的变量。更多信息,你可以参考PHP unset

$Array = array("test1", "test2", "test3", "test3");

unset($Array[2]);
  • PHP:数组弹出

array_pop()函数删除了数组的最后一个元素。更多信息,你可以参考PHP array_pop

$Array = array("test1", "test2", "test3", "test3");

array_pop($Array);
  • PHP:Array_splice(阵列)

array_splice()函数从一个数组中移除选定的元素,并用新的元素替换它。更多信息,你可以参考PHP array_splice

$Array = array("test1", "test2", "test3", "test3");

array_splice($Array,1,2);
  • PHP: 数组移位

array_shift()函数从一个数组中移除第一个元素。更多信息,你可以参考PHP array_shift

$Array = array("test1", "test2", "test3", "test3");

array_shift($Array);
msvairam 提问于2016-01-25
Rabby 修改于2020-10-16
#18楼
得票数 10

我只想说,我有一个特定的对象,它的属性是可变的(它基本上是对一个表的映射,我正在改变表中的列,所以对象中的属性,反映在表中也会有所不同)。

class obj {
    protected $fields = array('field1','field2');
    protected $field1 = array();
    protected $field2 = array();
    protected loadfields(){}
    // This will load the $field1 and $field2 with rows of data for the column they describe
    protected function clearFields($num){
        foreach($fields as $field) {
            unset($this->$field[$num]);
            // This did not work the line below worked
            unset($this->{$field}[$num]); // You have to resolve $field first using {}
        }
    }
}

$fields的整个目的只是,所以当它们被改变时,我不必在代码中到处寻找,我只是看一下类的开头,并改变属性列表和$fields数组的内容,以反映新的属性。

Oxydel 提问于2013-08-21
Peter Mortensen 修改于2019-02-19
#19楼
得票数 9

假设你有下面的数组。

Array
(
    [user_id] => 193
    [storage] => 5
)

要删除storage,请执行以下操作。

unset($attributes['storage']);
$attributes = array_filter($attributes);

而你得到的是。

Array
(
    [user_id] => 193
)
Tebe 提问于2015-06-11
Abdur Rehman 修改于2019-02-14
array_filter是用来做什么的?David 2017-03-17
删除虚假的元素Tebe 2017-06-26
那么array_filter()在你的论证中绝对是毫无意义的。mickmackusa 2021-08-22
unset()早在几年前就已经被推荐了。这个答案没有给这个规范页面增加新的价值。mickmackusa 2021-08-22
#20楼
得票数 9

在保持索引顺序的情况下,以及在不知道第一个项目的键名的情况下,有两种方法可以删除数组的第一个项目。

解决方案#1

// 1 is the index of the first object to get
// NULL to get everything until the end
// true to preserve keys
$array = array_slice($array, 1, null, true);

解决方案#2

// Rewinds the array's internal pointer to the first element
// and returns the value of the first array element.
$value = reset($array);
// Returns the index element of the current array position
$key = key($array);
unset($array[$key]);

对于这个样本数据来说。

$array = array(10 => "a", 20 => "b", 30 => "c");

你必须有这样的结果。

array(2) {
  [20]=>
  string(1) "b"
  [30]=>
  string(1) "c"
}
Nabi K.A.Z. 提问于2018-10-16
Peter Mortensen 修改于2019-02-22
在你发布答案之前,array_slice()unset()已经被证明过很多次。这个答案是多余的,只是在破坏研究者的经验。mickmackusa 2021-08-22
@mickmackusa 但我的回答是干净而明确的。Nabi K.A.Z. 2021-08-23
...而且是多余的。你没有给这个页面添加任何特定于元素删除的独特价值。你已经偏离了主题,谈论了如何针对第一个元素的关键。OP没有提到要针对第一个元素。你很可能因为在这个非常拥挤的页面上阅读了其他答案而被骗到一个不同的范围。为了改善研究者的经验,这个答案被安全地删除。mickmackusa 2021-08-23
#21楼
得票数 8

unset()从一个数组中取出多个零散的元素

虽然这里已经多次提到unset(),但还没有提到unset()接受多个变量,使得它可以很容易地在一次操作中从数组中删除多个非连续的元素。

// Delete multiple, noncontiguous elements from an array
$array = [ 'foo', 'bar', 'baz', 'quz' ];
unset( $array[2], $array[3] );
print_r($array);
// Output: [ 'foo', 'bar' ]

动态地unset()。

unset()不接受要删除的键的数组,所以下面的代码会失败(不过动态地使用unset()会稍微容易一些)。

$array = range(0,5);
$remove = [1,2];
$array = unset( $remove ); // FAILS: "unexpected 'unset'"
print_r($array);

相反,unset()可以在一个foreach循环中动态地使用。

$array = range(0,5);
$remove = [1,2];
foreach ($remove as $k=>$v) {
    unset($array[$v]);
}
print_r($array);
// Output: [ 0, 3, 4, 5 ]

通过复制数组来删除数组的键值

还有一种做法尚未提及。 有时,摆脱某些数组键的最简单方法是简单地将$array1复制到$array2中去。

$array1 = range(1,10);
foreach ($array1 as $v) {
    // Remove all even integers from the array
    if( $v % 2 ) {
        $array2[] = $v;
    }
}
print_r($array2);
// Output: [ 1, 3, 5, 7, 9 ];

显然,同样的做法也适用于文本字符串。

$array1 = [ 'foo', '_bar', 'baz' ];
foreach ($array1 as $v) {
    // Remove all strings beginning with underscore
    if( strpos($v,'_')===false ) {
        $array2[] = $v;
    }
}
print_r($array2);
// Output: [ 'foo', 'baz' ]
Kristoffer Bohmann 提问于2017-12-07
Abdur Rehman 修改于2019-02-14
#22楼
得票数 7
<?php
    // If you want to remove a particular array element use this method
    $my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");

    print_r($my_array);
    if (array_key_exists("key1", $my_array)) {
        unset($my_array['key1']);
        print_r($my_array);
    }
    else {
        echo "Key does not exist";
    }
?>

<?php
    //To remove first array element
    $my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");
    print_r($my_array);
    $new_array = array_slice($my_array, 1);
    print_r($new_array);
?>


<?php
    echo "<br/>    ";
    // To remove first array element to length
    // starts from first and remove two element
    $my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");
    print_r($my_array);
    $new_array = array_slice($my_array, 1, 2);
    print_r($new_array);
?>

输出量

 Array ( [key1] => value 1 [key2] => value 2 [key3] =>
 value 3 ) Array (    [key2] => value 2 [key3] => value 3 )
 Array ( [key1] => value 1 [key2] => value 2 [key3] => value 3 )
 Array ( [key2] => value 2 [key3] => value 3 )
 Array ( [key1] => value 1 [key2] => value 2 [key3] => value 3 )
 Array ( [key2] => value 2 [key3] => value 3 )
Umar Farooque Khan 提问于2016-08-16
Peter Mortensen 修改于2019-02-22
在调用unset()之前检查一个键是否存在是没有好处的。如果在数组中没有找到键,那么unset()将默默地什么也不做(如预期)。在这个答案发布之前,unset()array_slice()已经被推荐了。这个答案对这个页面没有增加新的价值。mickmackusa 2021-08-22
#23楼
得票数 7

根据一个键删除一个数组元素。

使用unset函数,如下图所示。

$a = array(
       'salam',
       '10',
       1
);

unset($a[1]);

print_r($a);

/*

    Output:

        Array
        (
            [0] => salam
            [2] => 1
        )

*/

根据值删除一个数组元素。

使用array_search函数来获得一个元素的键,并使用上述方式来删除一个数组元素,如下所示。

$a = array(
       'salam',
       '10',
       1
);

$key = array_search(10, $a);

if ($key !== false) {
    unset($a[$key]);
}

print_r($a);

/*

    Output:

        Array
        (
            [0] => salam
            [2] => 1
        )

*/
MahdiY 提问于2017-09-22
Peter Mortensen 修改于2019-02-22
unset()array_search()unset()在2017年就已经发布。这个答案只是在提供多余的见解。mickmackusa 2021-08-22
#24楼
得票数 7

编辑部

如果你不能认为该对象在该数组中,你就需要添加一个检查。

if(in_array($object,$array)) unset($array[array_search($object,$array)]);

原版答案

如果你想通过引用数组中的一个特定对象来删除该对象,你可以做以下事情。

unset($array[array_search($object,$array)]);

举例说明。

<?php
class Foo
{
    public $id;
    public $name;
}

$foo1 = new Foo();
$foo1->id = 1;
$foo1->name = 'Name1';

$foo2 = new Foo();
$foo2->id = 2;
$foo2->name = 'Name2';

$foo3 = new Foo();
$foo3->id = 3;
$foo3->name = 'Name3';


$array = array($foo1,$foo2,$foo3);
unset($array[array_search($foo2,$array)]);

echo '<pre>';
var_dump($array);
echo '</pre>';
?>

结果是。

array(2) {
[0]=>
    object(Foo)#1 (2) {
        ["id"]=>
        int(1)
        ["name"]=>
        string(5) "Name1"
    }
[2]=>
    object(Foo)#3 (2) {
        ["id"]=>
        int(3)
        ["name"]=>
        string(5) "Name3"
    }
}

请注意,如果该对象出现了几次,它将只在第一次出现时被删除。

Sam Tigle 提问于2019-06-11
Sam Tigle 修改于2021-08-24
这个答案并不稳定。如果目标数组的键没有被array_search()找到,那么它的返回值将有效地破坏[0]键的元素。这个片段很危险,应该被删除。先前有一些答案没有犯这个错误。mickmackusa 2021-08-22
@mickmackusa 谢谢你的提示,已经添加了一个检查。Sam Tigle 2021-08-24
in_array()对阵列进行潜在的全面扫描,然后用array_search()再次进行潜在的全面扫描,这绝对不是我推荐给任何人的。这简直是糟糕的做法。我的立场仍然是--这个答案犯了以前的答案没有犯的错误。纠正这个答案只会让它成为早期答案的累赘。如果这个答案被删除,这个页面将会得到改善。mickmackusa 2021-08-24
#25楼
得票数 6

使用下面的代码。

$arr = array('orange', 'banana', 'apple', 'raspberry');
$result = array_pop($arr);
print_r($result);
Jens Erat 提问
Jens Erat 修改于2019-02-19
php5: 只需运行array_pop($arr)就可以删除最后的条目。不需要` = `。Krista K 2014-09-16
#26楼
得票数 1

我来到这里是因为我想看看是否有比使用unset($arr[$i])更优雅的方法来解决这个问题。令我失望的是,这些答案要么是错误的,要么没有涵盖每一种边缘情况。

这就是array_diff()不起作用的原因。键在数组中是唯一的,而元素不一定是唯一的。

$arr = [1,2,2,3];

foreach($arr as $i => $n){
    $b = array_diff($arr,[$n]);
    echo "\n".json_encode($b);
}

结果是...

[2,2,3]
[1,3]
[1,2,2] 

如果两个元素是相同的,它们将被删除。这也适用于 array_search() 和 array_flip() 。

我看到很多关于array_slice()和array_splice()的答案,但是这些函数只对数字数组起作用。我所知道的所有答案在这里都没有回答这个问题,所以这里有一个可以工作的解决方案。

$arr = [1,2,3];

foreach($arr as $i => $n){
    $b = array_merge(array_slice($arr,0,$i),array_slice($arr,$i+1));
    echo "\n".json_encode($b);
}

Results...

[2,3];
[1,3];
[1,2];

既然unset($arr[$i])对关联数组和数字数组都有效,这仍然不能回答问题。

这个解决方案是对键进行比较,并使用一个可以处理数字和关联数组的工具。我使用array_diff_uassoc()来做这个。这个函数在一个回调函数中对键进行比较。

$arr = [1,2,2,3];
//$arr = ['a'=>'z','b'=>'y','c'=>'x','d'=>'w'];
foreach($arr as $key => $n){
    $b = array_diff_uassoc($arr, [$key=>$n], function($a,$b) {
        if($a != $b){
            return 1;
        }
    });
    echo "\n".json_encode($b);
}    

结果.....

[2,2,3];
[1,2,3];
[1,2,2];

['b'=>'y','c'=>'x','d'=>'w'];
['a'=>'z','c'=>'x','d'=>'w'];
['a'=>'z','b'=>'y','d'=>'w'];
['a'=>'z','b'=>'y','c'=>'x'];
Jed Lynch 提问于2020-10-13
Jed Lynch 修改于2020-10-19
#27楼
得票数 1

第一步,先从php合成器开始。

<?php

第二步

创建一个名为 "动物 "的数组

<?php 
$animals= array(
  
    'cat', // [0]
    'dog', // [1]
    'cow' // [2]
  
);

第3步

删除索引1的项目,该项目是 "for"。

unset($animals1[1]); 

第4步

打印修改后的数组

var_dump($danimals1);

第5步

重新索引数组中的元素

$newarray = array_values($animals1);
  

第6步

打印重新索引过的数组

var_dump($newarray);

第7步

关闭php代码

?>
Muhammad Ali Shah 提问于2022-09-27
标签