有没有一种简单的方法可以使用 PHP 从数组中删除一个元素,从而使 foreach ($array) 不再包含该元素?
我认为将它设置为 null 会做到这一点,但显然它不起作用。
huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。
删除数组元素有多种方法,其中有些方法对某些特定任务比其他方法更有用。
删除单个数组元素
如果您只想删除一个数组元素,您可以使用 unset() 或 \array_splice()。
如果您知道值并且不知道删除元素的键,您可以使用 \array_search() 来获取键。这仅在元素不多次出现时才有效,因为 \array_search 仅返回第一次命中。
未设置()
请注意,当您使用 unset() 时,数组键不会改变。如果要重新索引键,可以在 unset() 之后使用 \array_values(),这会将所有键转换为从 0 开始的数字枚举键。
代码:
$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,作为第二个参数。
代码:
$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() 一样,它不会更改数组的键。
代码:
$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()。您必须确保将键作为第二个参数中的键而不是值传递。键不会重新索引。
代码:
$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()。
代码:
$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]
@AlexandruRada 不,你说“不要使用这个”——这只是胡说八道。当您将数组视为字典时,您可以安全地使用此方法。只有当您期望连续的数字索引时,您才需要使用其他东西。
@AlexandruRada 当您从 $x = array(1, 2, 3, 4); unset($x[2]) 结果 必须 为 var_dump($x); // array(3) { [0]=> int(1) [1]=> int(2) [3]=> int(4) } 时,您不可能拥有 array (3) { [0]=>int(0) ...(可能是错字)
unset 可以有多个参数:void unset ( mixed $var [, mixed $... ] )。
array_filter 也是一种可行的方法。如果您不想改变数组但它也不会重新索引,这可能是 json_encode 的问题,那么特别好。 php.net/manual/en/function.json-encode.php#94157
unset 不是函数,而是语言结构(和关键字)。它不能也不能以 `` 为前缀
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
应该注意的是,unset() 将保持索引不变,这是您在使用字符串索引(数组作为哈希表)时所期望的,但在处理整数索引数组时可能会非常令人惊讶:
$array = array(0, 1, 2, 3);unset($array[2]);var_dump($array);$array = array(0, 1, 2, 3);array_splice($array, 2, 1);var_dump($array);
因此,如果您想规范化整数键,可以使用 array_splice()。另一种选择是在 unset() 之后使用 array_values():
$array = array(0, 1, 2, 3);unset($array[2]);$array = array_values($array);var_dump($array);
值得注意的是,当您使用 array_splice() 时,您需要知道要删除的任何元素的偏移量,而不是键,而是偏移量(!)
@Tom:对于常规数组(连续整数索引),偏移量是索引。这就是 array_splice 有意义的地方(除其他外)。
当然可以,但是如果您在使用 splice 之前篡改数组,请记住一些事情
从一个从巨大数组中删除大量元素的基本测试来看,array_splice 似乎要快得多,而且内存占用更少。这与我的预期相符:array_values() 似乎正在制作数组的副本,而 array_splice 可以正常工作。
当您在循环中删除元素并希望索引保持一致但又想在循环后将它们压缩出来时,array_values 是一种有用的方法。
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
// 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)
$get_merged_values = array_merge($data['res'],$data['check_res']);当我打印这个 print_r($get_merged_values);它显示以下内容。数组 ( [0] => 数组 ( [menu_code] => 2 [menu_name] => 植物 [menu_order_no] => 1 ) [1] => 数组 ( [menu_code] => 3 [menu_name] => 行 [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 ][菜单名称]。请帮我怎么做?
问题的措辞与陈述的方式具有误导性。如果你想在 foreach 循环中删除 $arr[$i] 如果多个元素具有相同的值,这将不起作用。
huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!
$key = array_search($needle, $array);if ($key !== false) { unset($array[$key]);}
最好澄清一下,当您知道值而不是键时,此答案是用于删除元素。请注意,它只删除该值的第一个实例;要查找值的 所有 键,请使用 array_keys
如果多个元素具有相同的值,这将不起作用。
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!
unset($array[$index]);
huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!
此外,对于命名元素:
unset($array["elementName"]);
$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 )
您似乎无法取消设置由字符串索引的数组元素(生成“致命错误:无法取消设置字符串偏移量”)。我认为情况并非总是如此,但肯定是从 PHP 5.3.10 开始,可能更早
@carpii PHP 可以从关联数组中取消设置元素。当您尝试在字符串而不是数组上使用 unset($var['key']) 时会导致致命错误 例如: $array = array( 'test' => 'value', 'another' => '价值', );未设置($array['test']); // 按预期从数组中删除“test”元素 $array = 'test';未设置($array['test']); // 按预期抛出“致命错误:无法取消设置字符串偏移量”
这里你必须知道键名,最好是:stackoverflow.com/a/52826684/1407491
@Eran 早在 2008 年就推荐过 unset()!如果您想改进该建议,则应该编辑该答案。这个多标签页上有太多多余的内容了!
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
如果您有一个数字索引数组,其中所有值都是唯一的(或者它们是非唯一的,但您希望删除特定值的所有实例),您可以简单地使用 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);
这将显示以下内容:
43
在此示例中,删除了值为“Charles”的元素,这可以通过 sizeof() 调用来验证,该调用报告初始数组的大小为 4,删除后为 3。
如果两个元素具有相同的值,这将不起作用。
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!
销毁数组的单个元素
unset()
$array1 = array('A', 'B', 'C', 'D', 'E');unset($array1[2]); // Delete known index(2) value from arrayvar_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
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!
array_shift 如果它是整数,则重新索引关键项目,所以它很糟糕,所以你可以使用这个:stackoverflow.com/a/52826684/1407491
array_shift() 的复杂度为 O(n)(由于重新索引数字索引),而 array_pop() 的复杂度为 O(1)。如何知道第一个元素的索引?只需在第一次迭代中启动 foreach 和 break 即可。
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
输出:
[ [0] => fruit2 [1] => fruit3 [2] => fruit4]fruit1
请注意,array_shift 只能删除数组中的第一个元素。同样使用 array_pop 删除数组中的最后一个元素。
Answer 仅适用于数组的第一个元素,不回答一般问题。
@sebweisgerber 你是对的,但我不认为这是错误的 ans 并且需要对此 ans 投反对票。问题是删除一个不提及任何位置的元素。
这仅涵盖一种边缘情况
这种技术没有高度的实用性——如前所述。这个答案缺少它的教育解释。
huntsbot.com – 高效赚钱,自由工作
如果指定了索引:
$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 条件是必要的,因为如果找不到 index,unset() 将自动删除数组的第一个元素,这不是我们想要的。
unset() 早在几年前就已在此页面上多次推荐。 array_search() 和 unset() 早在 2011 年就得到了演示。stackoverflow.com/a/8135667/2943403这个答案没有给这个页面增加新的价值。
@mickmackusa 也许你是对的,这个答案中的所有信息都可以在其他不同的答案中找到。但也许针对不同的条件将所有这些都放在一个答案中并简单地解释一下,可以为某人节省一些时间。所以我猜它可以被认为是价值!
这是一种看待它的方式。查看这个多标签页的另一种方式是“带有冗余建议的严重过度膨胀”。研究人员一遍又一遍地浏览相同的建议,以确保他们正在考虑所有相关的建议。因为答案是单一和多种技术的混合体,而且许多答案都在说同样的事情——研究人员的经验受到了很大的破坏。想象一下,如果您需要此页面的建议。你想读一本充满多余建议的小说吗?我不会。
如果您个人发现以前的答案“不清楚”或需要更多详细信息,您可以编辑这些答案以更好地帮助研究人员,而不是发布新答案。这意味着更好的建议分布在更少的总答案中。
在很多情况下,我同意你的看法。但我认为编辑答案的目的是修复一些单词或小的技术错字,而不是扩展/更改它。无论如何,我自己花了一些时间浏览所有答案并找出一种简单有效的方法,并提出了这个解决方案,我觉得分享它可能是一个好主意。我认为它得到一些支持的原因是其他人有同样的情况,并且发现这个答案简单易懂且涵盖了! @mickmackusa
huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求
如果您必须删除数组中的多个值并且该数组中的条目是对象或结构化数据,那么 array_filter() 是您的最佳选择。从回调函数返回 true 的那些条目将被保留。
$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']]
原文链接:https://www.huntsbot.com/qa/YlXZ/deleting-an-element-from-an-array-in-php?lang=zh_CN&from=csdn
HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com
来源地址:https://blog.csdn.net/kalman2019/article/details/128439899