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

这篇具有很好参考价值的文章主要介绍了在 PHP 中从数组中删除一个元素。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问:

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

我认为将它设置为 null 会做到这一点,但显然它不起作用。

答1:

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 不是函数,而是语言结构(和关键字)。它不能也不能以 `` 为前缀

答2:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

应该注意的是,unset() 将保持索引不变,这是您在使用字符串索引(数组作为哈希表)时所期望的,但在处理整数索引数组时可能会非常令人惊讶:

$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)
} */

值得注意的是,当您使用 array_splice() 时,您需要知道要删除的任何元素的偏移量,而不是键,而是偏移量(!)

@Tom:对于常规数组(连续整数索引),偏移量是索引。这就是 array_splice 有意义的地方(除其他外)。

当然可以,但是如果您在使用 splice 之前篡改数组,请记住一些事情

从一个从巨大数组中删除大量元素的基本测试来看,array_splice 似乎要快得多,而且内存占用更少。这与我的预期相符:array_values() 似乎正在制作数组的副本,而 array_splice 可以正常工作。

当您在循环中删除元素并希望索引保持一致但又想在循环后将它们压缩出来时,array_values 是一种有用的方法。

答3:

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] 如果多个元素具有相同的值,这将不起作用。

答4:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

$key = array_search($needle, $array);
if ($key !== false) {
    unset($array[$key]);
}

最好澄清一下,当您知道值而不是键时,此答案是用于删除元素。请注意,它只删除该值的第一个实例;要查找值的 所有 键,请使用 array_keys

如果多个元素具有相同的值,这将不起作用。

答5:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

unset($array[$index]);

答6:

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()!如果您想改进该建议,则应该编辑该答案。这个多标签页上有太多多余的内容了!

答7:

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);

这将显示以下内容:

4
3

在此示例中,删除了值为“Charles”的元素,这可以通过 sizeof() 调用来验证,该调用报告初始数组的大小为 4,删除后为 3。

如果两个元素具有相同的值,这将不起作用。

答8:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

销毁数组的单个元素

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

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

array_shift 如果它是整数,则重新索引关键项目,所以它很糟糕,所以你可以使用这个:stackoverflow.com/a/52826684/1407491

array_shift() 的复杂度为 O(n)(由于重新索引数字索引),而 array_pop() 的复杂度为 O(1)。如何知道第一个元素的索引?只需在第一次迭代中启动 foreach 和 break 即可。

答9:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。



输出:

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

fruit1

请注意,array_shift 只能删除数组中的第一个元素。同样使用 array_pop 删除数组中的最后一个元素。

Answer 仅适用于数组的第一个元素,不回答一般问题。

@sebweisgerber 你是对的,但我不认为这是错误的 ans 并且需要对此 ans 投反对票。问题是删除一个不提及任何位置的元素。

这仅涵盖一种边缘情况

这种技术没有高度的实用性——如前所述。这个答案缺少它的教育解释。

答10:

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

答11:

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://www.toymoban.com/news/detail-422587.html

到了这里,关于在 PHP 中从数组中删除一个元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 努力有没有用?

    努力有没有用? 都说站在风口浪尖,猪都能飞起来。 但时代的红利也是给有准备的人才能抓住。凭什么人家努力了那么久,做了那么多准备,在无人问津的小黑屋熬那么久,终于出人头地后被说成是吃了时代的红利。 努力,汉语词语。拼音:nǔ lì 释义:尽力的使出自己的

    2024年02月08日
    浏览(81)
  • @Conditional+@Configuration有没有搞头?

    在了解 @Conditional 之前先花 10 秒钟复习一下 @Configuration 这个注解。 @Configuration 是干什么? 是配合 @Bean 注解来配置 Spring 容器的 bean 的。 那它为什么会出现呢? 因为配置 bean 的另一种方式是 xml ,狗都不用。 那给个示例看看呗? 简单。 下面进入主题: @Conditional 是什么东西

    2024年02月03日
    浏览(56)
  • 怎么看自己有没有安装tensorflow

    如果您想检查计算机上是否已安装 TensorFlow,您可以尝试执行以下步骤: 打开命令行终端。 在命令行中输入 \\\"python\\\",然后按回车键,打开 Python 解释器。 在 Python 解释器中,输入 \\\"import tensorflow\\\",然后按回车键。 如果 TensorFlow 已安装,您将不会看到任何错误消息。相反,您将

    2024年02月16日
    浏览(58)
  • 有没有比读写锁更快的锁

    在之前的文章中,我们介绍了读写锁,学习完之后你应该已经知道了读写锁允许多个线程同时访问共享变量,适用于读多写少的场景。那么在读多写少的场景中还有没有更快的技术方案呢?还真有,在Java1.8这个版本里提供了一种叫StampedLock的锁,它的性能就比读写锁还要好。

    2024年02月12日
    浏览(55)
  • 有没有免费版的配音软件?

    先不要着急去买付费的配音软件。 (我就被忽悠过,买了付费配音软件后,实际没用几次) 当你明确的知道,剪映配音的不足时,再考虑选付费的配音软件。 img src=\\\"https://picx.zhimg.com/50/v2-95aba0d9f80af68ad0cb25c5afbee450_720w.jpg?source=1940ef5c\\\" data-caption=\\\"\\\" data-size=\\\"small\\\" data-rawwidth=\\\"821\\\"

    2024年02月07日
    浏览(52)
  • 有没有高效便捷的视频下载工具?

    做影视剪辑或者后期工作的小伙伴们,经常需要扒一些视频作为素材,今天给大家分享四个高效便捷的视频下载工具,总有一个你满意的! 一、 Downni 一个超级视频下载工具,支持全网1000+平台视频的解析,页面清爽整洁,功能一目了然,支持不同分辨率的格式下载,还可以

    2024年02月08日
    浏览(52)
  • 使用键盘测试图解(测试键盘有没有失灵)

    键盘是很容易坏的电脑外置设备,也是必不可少的电脑用品,经常使用电脑 特别是程序猿(媛)更是每天都在使用 键盘很容易出现问题,键盘失灵后有的字或者数字打不出来特别烦人。这里给您提供一个方法,测试您键盘按键的好坏在线测试工具,每按一下键盘上按键,就

    2024年02月12日
    浏览(51)
  • 怎么知道网站服务器有没有被攻击?

    ​ 一个网站服务器遭到攻击可能会给企业带来巨大的金融损失,因此,企业需要及时发现服务器是否被攻击。但是,企业如何知道自己的服务器是否被攻击呢?下面,我们来看一些服务器被攻击的警告信号。   1.网络延迟增加 在网络攻击中,攻击者的行为会导致服务器和网络

    2024年02月02日
    浏览(191)
  • 软考中级到底有没有用?价值高吗?

    软考中级证书是国家计算机技术与软件专业职业资格认证的一种,是IT行业中较为实用的证书之一。它对于个人职业发展和企业提升都有着重要的意义。本文将从个人和企业两个角度来探讨软考中级证书的价值。 1.提高职业技能水平 软考中级证书是一种专业水平的认证,证明

    2023年04月15日
    浏览(49)
  • ubuntu 系统 怎么判断系统有没有GPU

    在 Ubuntu 系统中,您可以通过几种方式来检查系统是否包含显卡,以及显卡的详细信息。以下是一些常用的方法: lspci 命令 : 打开终端。 输入 lspci | grep VGA 命令。 这将显示系统中所有的 VGA 兼容设备,通常是您的显卡。 lshw 命令 : 在终端中输入 sudo lshw -C display 。 这将提供

    2024年04月15日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包