PHP:如何从数组中删除特定元素?
Posted
技术标签:
【中文标题】PHP:如何从数组中删除特定元素?【英文标题】:PHP: How to remove specific element from an array? 【发布时间】:2011-01-27 18:48:44 【问题描述】:当我知道元素的值时,如何从数组中删除元素?例如:
我有一个数组:
$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
用户输入strawberry
strawberry
已从 $array
中删除。
全面解释:
我有一个数据库,其中存储了一个以逗号分隔的项目列表。代码根据用户选择所在的选项拉入列表。因此,如果他们选择草莓,他们的代码会在每个条目中提取草莓,然后使用 split() 将其转换为数组。我想让他们从数组中删除用户选择的项目,例如草莓。
【问题讨论】:
同样的问题:***.com/questions/7225070/… 另一个同样的问题:***.com/questions/1883421/… 更多相同问题:***.com/questions/369602/… 【参考方案1】:你可以试试这个
<?php
$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$key = in_array("strawberry",$array);
if ($key)
unset($array[$key]);
?>
【讨论】:
这不起作用,因为 in_array 返回布尔值而不是针的索引。【参考方案2】:使用这个简单的方法希望它会有所帮助
foreach($array as $k => $value)
if($value == 'strawberry')
unset($array[$k]);
【讨论】:
【参考方案3】:foreach ($get_dept as $key5 => $dept_value)
if ($request->role_id == 5 || $request->role_id == 6)
array_splice($get_dept, $key5, 1);
【讨论】:
除了您提供的答案之外,请考虑提供一个简短说明,说明为什么以及如何解决此问题。【参考方案4】:你可以做单行。它将从数组中删除元素
$array=array_diff($array,['strawberry']);
【讨论】:
这应该是公认的答案,因为未设置会在数组中留下一个“洞”。 也许可以,但代码应该很简单……亲吻原则【参考方案5】:您可以使用数组过滤器通过$v
上的特定条件删除项目:
$arr = array_filter($arr, function($v)
return $v != 'some_value';
);
【讨论】:
投反对票。这种低质量(因为它是一个纯代码答案并给出解析错误)是 D.Martin 方法的副本,该方法仅在array_filter()
中使用匿名函数。虽然我个人会在我的实现中使用匿名函数,但我相信对 SO 的正确操作是评论或编辑 D.Martin 的答案,如果您希望进行微改进,以便此页面不会变得臃肿。请删除这个重复的答案。【参考方案6】:
使用array_diff()
1 行解决方案:
$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi', 'strawberry'); //throw in another 'strawberry' to demonstrate that it removes multiple instances of the string
$array_without_strawberries = array_diff($array, array('strawberry'));
print_r($array_without_strawberries);
...不需要额外的函数或 foreach 循环。
【讨论】:
这个解决方案比***解决方案更清晰。 虽然如果strawberry
不在初始数组中,它会在$array_without_strawberries
数组中可用——如果你想确保给定的元素不在数组中,这是危险的代码。跨度>
@Erfan 你的说法是错误的。 $a = array_diff(array(), array('strawberry'));
- $a 是一个空数组。
你说得对@bancer - 我可能在想array_intersect 什么的。
array_diff() 比标记的答案更优雅。【参考方案7】:
我正在寻找同一个问题的答案并遇到了这个话题。我看到两种主要方式:array_search
和unset
的组合以及array_diff
的使用。乍一看,在我看来,第一种方法会更快,因为不需要创建额外的数组(如使用array_diff
时)。但是我写了一个小基准,确保第二种方法不仅更简洁,而且速度更快!很高兴与您分享这个。 :)
https://glot.io/snippets/f6ow6biaol
【讨论】:
【参考方案8】:这个问题有几个答案,但我想添加更多内容,因为当我使用 unset
或 array_diff
时,当删除特定元素时,我在处理新数组的索引时遇到了几个问题(因为初始索引已保存)
我回到例子:
$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$array_without_strawberries = array_diff($array, array('strawberry'));
或
$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[array_search('strawberry', $array)]);
如果您打印结果,您将获得:
foreach ($array_without_strawberries as $data)
print_r($data);
结果:
> apple
> orange
> blueberry
> kiwi
但索引将被保存,因此您将访问您的元素,例如:
$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[3] > blueberry
$array_without_strawberries[4] > kiwi
因此最终的数组不会被重新索引。所以需要在unset
或者array_diff
后面加上:
$array_without_strawberries = array_values($array);
之后你的数组将有一个正常的索引:
$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[2] > blueberry
$array_without_strawberries[3] > kiwi
与此帖相关:Re-Index Array
希望对你有帮助
【讨论】:
【参考方案9】:如果您在此处使用普通数组(似乎是这种情况),则应该改用以下代码:
if (($key = array_search('strawberry', $array)) !== false)
array_splice($array, $key, 1);
unset($array[$key])
仅删除元素,但不重新排序普通数组。
假设我们有一个数组并使用array_splice:
$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
array_splice($array, 2, 1);
json_encode($array);
// yields the array ['apple', 'orange', 'blueberry', 'kiwi']
与未设置相比:
$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[2]);
json_encode($array);
// yields an object "0": "apple", "1": "orange", "3": "blueberry", "4": "kiwi"
注意unset($array[$key])
不会重新排列数组。
【讨论】:
官方unset
不返回任何东西。所以json_encode(unset($array[2]))
不适合做比较。
这正是我所需要的,感谢 ericluwj【参考方案10】:
<?php
$array = array("apple", "orange", "strawberry", "blueberry", "kiwi");
$delete = "strawberry";
$index = array_search($delete, $array);
array_splice($array, $index, 1);
var_dump($array);
?>
【讨论】:
你可以写一两句话来改进这个答案:a)代码的作用,b)为什么你认为它是所有其他答案中的一个选项。【参考方案11】:$remove= "strawberry";
$array = ["apple", "orange", "strawberry", "blueberry", "kiwi"];
foreach ($array as $key => $value)
if ($value!=$remove)
echo $value.'<br/>';
continue;
【讨论】:
这个答案甚至没有删除所需的选项。【参考方案12】:PHP array delete by value (not key)的答案 由 https://***.com/users/924109/rok-kralj
IMO 是最好的答案,因为它会移除且不会变异
array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]
它很好地概括了,如果你愿意,你可以同时删除尽可能多的元素。
免责声明:请注意,我的解决方案会生成数组的新副本,同时保持旧副本完好无损,而接受的答案会发生变异。因此,它可能会慢一些。
【讨论】:
【参考方案13】:更好的方法可能是将您的值作为键保留在关联数组中,然后在您想要实际数组时调用array_keys()
。这样您就无需使用array_search
来查找您的元素。
【讨论】:
您的帖子是评论而不是答案。请删除并在问题本身下发布。【参考方案14】:使用删除特定数组值创建数值数组
<?php
// create a "numeric" array
$animals = array('monitor', 'cpu', 'mouse', 'ram', 'wifi', 'usb', 'pendrive');
//Normarl display
print_r($animals);
echo "<br/><br/>";
//If splice the array
//array_splice($animals, 2, 2);
unset($animals[3]); // you can unset the particular value
print_r($animals);
?>
You Can Refer this link..
【讨论】:
投反对票。该问题明确要求根据值(而不是键)删除值。此答案无用,请删除。【参考方案15】:这是一个简单的重复,可以删除数组中的多个值。
// Your array
$list = array("apple", "orange", "strawberry", "lemon", "banana");
// Initilize what to delete
$delete_val = array("orange", "lemon", "banana");
// Search for the array key and unset
foreach($delete_val as $key)
$keyToDelete = array_search($key, $list);
unset($list[$keyToDelete]);
【讨论】:
这是 PHP 开发人员已经在array_diff()
中创建的低效、自制的替代品。这是如何获得三个赞成票的。没有人应该发现这个答案有帮助或在他们自己的项目中使用它。我建议删除此答案 - 这将使您的帐户免于低质量答案,减少此页面上的答案膨胀,并为您赢得纪律徽章。我将推迟我的反对票,以便您有时间删除以获得奖励。【参考方案16】:
我目前正在使用这个功能:
function array_delete($del_val, $array)
if(is_array($del_val))
foreach ($del_val as $del_key => $del_value)
foreach ($array as $key => $value)
if ($value == $del_value)
unset($array[$key]);
else
foreach ($array as $key => $value)
if ($value == $del_val)
unset($array[$key]);
return array_values($array);
您可以输入一个数组或只输入一个字符串,其中包含应删除的元素。 像这样写:
$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$detils = array_delete(array('orange', 'apple'), $detils);
或
$detils = array_delete('orange', $detils);
它还会重新索引它。
【讨论】:
这是非常复杂和循环的。这是如何获得 3 票的?!?【参考方案17】:$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
function remove_embpty($values)
if($values=='orange')
$values='any name';
return $values;
$detils=array_map('remove_embpty',$detils);
print_r($detils);
【讨论】:
请补充说明。它是如何解决问题的。 您的答案将数组的一个元素替换为另一个 NO 以删除一个元素 投反对票。这个答案没有提供预期的输出。请删除此错误答案。【参考方案18】:我更喜欢使用 array_key_exists 来搜索数组中的键,例如:
Array([0]=>'A',[1]=>'B',['key'=>'value'])
要有效地找到指定的,因为 array_search 和 in_array() 在这里不起作用。并使用 unset() 删除内容。
我认为它会对某人有所帮助。
【讨论】:
【参考方案19】:if (in_array('strawberry', $array))
unset($array[array_search('strawberry',$array)]);
【讨论】:
你应该测试 strawberry 是否在数组中。 按照 Gumbo 的建议修改了答案,包括在从数组中删除元素之前对其进行验证。 另外请记住,删除特定元素后索引不会重新对齐。换句话说,索引序列将有间隙。如果您从示例中删除“草莓”,“猕猴桃”仍将具有索引 4,而索引 2 将简单地消失。如果您的代码依赖于索引序列的完整性,这很重要,例如 for($i = 0; $i <..> 添加到香蕉王所说的,如果你想重新索引数组,只需执行$my_array = array_values($my_array);
。
虽然此解决方案是正确的,但它会搜索数组 TWICE(in_array
和 array_search
)。在 Gumbo 的回答中使用 array_search
的返回更有效【参考方案20】:
unset($array[array_search('strawberry', $array)]);
【讨论】:
投反对票。array_search()
-unset()
方法早在你之前就已经由 John Conde 发布了。重复的答案对读者没有价值,实际上是一种不便,因为在滚动和阅读冗余信息时会浪费时间。请删除此答案。【参考方案21】:
使用array_seach()
,尝试以下操作:
if(($key = array_search($del_val, $messages)) !== false)
unset($messages[$key]);
array_search()
返回它找到的元素的键,可用于使用unset()
从原始数组中删除该元素。它会在失败时返回FALSE
,但是它可以在成功时返回“falsey”值(例如,您的键可能是0
),这就是使用严格比较!==
运算符的原因。
if()
语句将检查array_search()
是否返回了值,并且只有在返回时才会执行操作。
【讨论】:
投反对票。这是 Gumbo 方法(目前是公认的解决方案)的副本,该方法比您早几年发布。重复的答案没有价值,只会导致不必要的页面膨胀。请删除您的答案。如果您想解释 Gumbo 的答案,请编辑他的答案或让 Gumbo 扩展他自己的答案。【参考方案22】:会是这样的:
function rmv_val($var)
return(!($var == 'strawberry'));
$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$array_res = array_filter($array, "rmv_val");
【讨论】:
【参考方案23】:使用array_search
获取密钥并使用unset
删除它(如果找到):
if (($key = array_search('strawberry', $array)) !== false)
unset($array[$key]);
如果没有找到任何项目,array_search
返回 false(null 直到 PHP 4.2.0)。
如果可以有多个item具有相同的值,可以使用array_keys
获取所有item的key:
foreach (array_keys($array, 'strawberry') as $key)
unset($array[$key]);
【讨论】:
得到一个奇怪的结果。我使用了您的第一个建议,因为总是只有一个实例。为了测试它,我只是让它输出键值。工作。但是,它不会取消设置。 while(odbc_fetch_row($runqueryGetSubmenus)) $submenuList = odbc_result($runqueryGetSubmenus,"submenus"); $submenuArray = split(',',$submenuList); if (($key = array_search($name,$submenuArray)) !== false) unset($submenuArray[$key]); @dcp3450:你用$submenuArray
做什么? (请注意,每个循环 $submenuArray
都会被覆盖。)
我更新了我的问题以便更好地解释。基本上,代码遍历数据库中的条目,删除所选项目,在本例中为“草莓”。因此,用户输入一个选项 => 代码在子菜单下搜索并找到任何具有该选项的列表 => 将该列表转换为一个数组 => 删除所选选项。
我明白了!我没有将新数组重写回数据库。长时间盯着代码很容易错过。以上是关于PHP:如何从数组中删除特定元素?的主要内容,如果未能解决你的问题,请参考以下文章