我有一个PHP数组,如下所示:
1
| $messages = [312, 401, 1599, 3, ...]; |
我想删除包含值$del_val的元素(例如,$del_val=401),但我不知道它的键。这可能有帮助:每个值只能存在一次。
我正在寻找执行此任务的最简单函数。
- @AdamStrudwick但是如果在这个数组上有许多删除操作,那么迭代一次并使其键与值相同会更好吗?
- 同样的问题:stackoverflow.com/questions/1883421/…
- 可以复制php从数组中删除元素
使用array_search()和unset尝试以下操作:
1 2 3
| if (($key = array_search($del_val, $messages)) !== false) {
unset($messages[$key]);
} |
array_search()返回找到的元素的键,该键可用于使用unset()从原始数组中删除该元素。它会在失败时返回FALSE,但是它会在成功时返回一个错误的y值(例如,您的密钥可能是0),这就是为什么使用严格比较!==运算符的原因。
if()语句将检查array_search()是否返回值,并且仅在返回值时执行操作。
- 我_ messages美元(美元= array diff(messages,阵元_ Val)工作过吗?它在表现会更好吗?
- 测试@亚当为什么不出来?我的感觉是好的,它会array_diff()?比较两arrays slower as,not只是一array_search()搜索一样。
- 即使this is valid,You should like that avoid assigning值的声明。它只会把你的麻烦"。
- 如果0$keyis?
- 你的意思是adlawson @?
- 埃文说确切的说因为是什么@ @亚当。if the key = 0for the美元_ Val,你will not unset EN。它也可以很难,assignments to maintain这样。
- 我回答我的!==amended虚假;the check for the Will Return型了,太。"亚当,please change to防止任何错误你的代码你会得到在未来。
- 如果你找has the value of a key或值的任何其他0falsey unset the value,它不会和你的代码不工作。$key === falseYou should测试。(你要编辑它)
- 我一直answer' changed"埃文。谢谢你为这个问题好了指指点点,as in the form of as the interslap REP - 2。
- that this will not阵列已知的复位键。
- 严格比较+ 1)。我有我的钥匙在哪里,我发现我0房屋。
- php5.3 for >:美元美元=阵列阵列阵列,_ filter(function(美元)(美元的回报。值=美元);};
- 本会的工作目标arrays在线杂志,fyi。
- 0键that are to catch the following表厂,虚假:if(!===_搜索阵列nullkey美元(美元)美元_ Val,messages){……}
- 只是想与安与恩阵列五0值and the above the first只是尾巴removed 0元(with the index = 0),而其他元素与指标1、2、3 remained &;4。
- 如果你reorder then the need to change to array_spliceunset钥匙。array_splice($messages, $key, 1);
- 它也array_search($value, $array, false)matches should be to catch在没有匹配的变量类型。"123" == 123前。
- 漂亮的标准是"adlawson thing to do。但它在做比较时在线the same in this is like is done丑女*答案D移出来。
- 我想我应该在这段做好环多值可以occur because the Times。
- 如果你的代码会失败的关键在搜索阵列_ find值然后将演化关键变量0美元,然后unset(true to key message [ ]美元美元(美元)unset will be this message [真])将随机unset key。
- "谢谢你"adamstrudwick solution is Very Best,为我。
从数组中删除一个元素基本上就是用一个元素设置差异。
1
| array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3] |
它可以很好地进行归纳,如果需要的话,您可以同时删除任意多的元素。
免责声明:请注意,我的解决方案生成了一个新的数组副本,同时保持旧数组的完整性,与公认的可变答案形成对比。选择你需要的那个。
- this only for that can be工厂对象到字符串的转换
- 结果似乎是在进入parse error to be used for [$element]是说,array($element)instead。我不希望任何人谁,什么大不了的,但我知道,他们在相似的问题不是T的光环
- 当然,我现在是assumed PHP 5.4在下拉位置多数to the old。thanks for the remark。
- 这是值得noting that for some reason array_diffuses (string) $elem1 === (string) $elem2as its not as $elem1 === $elem2平等condition,你可能期望。the问题超时模式@角nischayn22 of this is a考虑后果。如果你想使用的东西,将工作作为效用函数为任意元素(arrays of which might be对象),bojangle' S for this reason might be更好的答案。
- 这也说明,在internally method for each performs sort to the argument array_diff()和thus nudges运行了O(N LG N)从O(N)。
- 我不知道为什么,but the [$element]brackets打破我在广场array($element)是队列,而工作。
- for队接受字符串或数组,数组的方式,return array_diff($array (array)$element)is:
- 最好的解决方案和cleanest -不知道为什么它是not accepted。done with平原和原生PHP函数。
- 为什么PHP函数创建一个单独的函数形式?这是因为你可以只是overkill呼叫_ directly with the same array diff的参数。
- 这是一种比数组搜索慢的方法。请参见@jack comment:it将复杂性从o(n)更改为o(n lg n),即对于1000个元素,此解决方案所需的CPU时间将比数组搜索多7倍。
- @他不知道自己在说什么。此函数的复杂性取决于实现和版本。
- 我同意Krzysztof prygoda的观点,这个函数比数组_search()慢两个数量级,实际元素为2544个。
- 要确保它是可写的,请使用数组_值(数组_diff($arr1,$arr2));
- 这将创建一个新数组。与unset解决方案相比,这不是一个缺点吗?
- 对我不起作用:我在一个包含2个元素的数组中使用它,而第一个元素将被删除,但元素保留其索引,但似乎无法读取:注意:未定义的偏移量:0
- 最清晰、最易读的答案
- 这对我很有帮助:$alphabet = range('A', 'Z'); $allowedLetters = array_diff($alphabet, ['Q', 'X', 'Y', 'Z']);。
一个有趣的方法是使用array_keys():
1 2 3
| foreach (array_keys($messages, 401, true) as $key) {
unset($messages[$key]);
} |
array_keys()函数接受两个附加参数,仅返回特定值的键以及是否需要严格检查(即使用==进行比较)。
这也可以删除具有相同值的多个数组项(例如[1, 2, 3, 3, 4])。
- @BlasteralFred瘻线性搜索是O(N);我不知道为什么你似乎认为这是一个问题。
- 是的,这对于选择多个数组项/键很有效。
- 这对于可能不包含所有唯一值的数组是最好的。
- 问题是,它会将键的索引保留在排序中:[0]-a,[2]-b(虽然[1]已不存在,但数组仍会忽略它)
- @Rodniko在这种情况下,您也需要array_values();但是剩余的密钥仍然是相同的顺序,所以从技术上讲,它不是"未排序的"
如果确定数组只包含一个具有该值的元素,可以这样做
但是,如果值可能在数组中出现多次,则可以执行此操作。
1 2 3
| $array = array_filter($array, function($e) use ($del_val) {
return ($e !== $del_val);
}); |
注:第二个选项仅适用于带闭包的php5.3+。
- 只有当数组不包含要删除的值以外的重复值时,此操作才有效。
- @jberculo,有时这正是您所需要的,在某些情况下,它节省了我在它上面做一个独特的数组。
- 也许吧,但我会使用专门设计的函数来实现这一点,而不是仅仅是一个函数的幸运副作用,这个函数基本上是用来做其他事情的。它也会降低代码的透明性。
- 消息中说"每个值只能存在一次",这应该有效。如果海报使用了smae变量名并添加了一些解释,那就太好了。
- 这个解决方案对我很有帮助,因为我已经使数组唯一,并且不关心键,只关心以前的突变返回的值。
- 显然,与所选解决方案相比,这是最快的,我做了小基准测试。
查看以下代码:
1
| $arr = array('nice_item', 'remove_me', 'another_liked_item', 'remove_me_also'); |
你可以做到:
这样就可以得到这个数组:
1
| array('nice_item', 'another_liked_item') |
- 这对关联数组有效吗?
- 对于关联数组,必须使用数组diff_assoc()。
- 这和这个答案有什么不同?
最好的办法是array_splice。
最好的理由在http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-array-in-php/
- 这不适用于关联数组和键中有间隙的数组,例如[1, 2, 4 => 3]。
- 不,对不起,这样行。请阅读我提供的文章链接
- 不会的,考虑我上面评论的数组,当我用你的代码去掉值3后,数组就是[1, 2, 3],也就是说,这个值没有去掉。明确地说,我并不是说它在所有情况下都失败了,只是这一个。
- 数组拼接是最好的方法,unset删除后不调整数组索引
通过以下代码,重复值将从$messages中删除。
$messages = array_diff($messages, array(401));
- 投了赞成票它已经是其他答案中的一个,但你最好保持简单,就像你所拥有的那样。答案只是"数组差异"
- 看起来很简单,但它将复杂性从O(n)改为O(n lg n)。所以,事实上它更复杂;)
或者简单地说,手动方式:
1 2 3 4 5
| foreach ($array as $key => $value){
if ($value == $target_value) {
unset($array[$key]);
}
} |
这是其中最安全的,因为您可以完全控制阵列
- 使用array_splice()而不是unset()也会对数组索引重新排序,在这种情况下可能会更好。
1 2 3 4 5 6 7 8 9 10
| function array_remove_by_value ($array, $value)
{
return array_values(array_diff($array, array($value)));
}
$array = array(312, 401, 1599, 3);
$newarray = array_remove_by_value ($array, 401);
print_r($newarray); |
产量
Array ( [0] => 312 [1] => 1599 [2] => 3 )
- 解决方案reorganize this the index,良好的工作。
- if this is not sure我因为这个解决方案involves快多功能电话。
如果您有>php5.3,则有一行代码:
1
| $array = array_filter($array, function($i) use ($value){return $i != $value;}); |
- 你确定?这个闭包没有访问$value的权限,所以实际上它必须放在一个迷你类中,这样您就可以在闭包中访问$value…
- @cale_b,我已经更新了这个例子。这里还有参考:php.net/manual/en/functions.anonymous.php
- 如果您称之为"一行代码",那么您也可以在一行上编写整个代码库。
你可以做到:
说明:翻转数组后,删除键为401的元素。
- 如果你想保护国家,你必须非常小心。因为所有未来的代码都必须有值而不是键。
- @saadlulu$messages数组不会被翻转,因为array_flip()不会影响原始数组,所以应用前一行后得到的数组将是相同的,除非不需要的结果将被删除。
- 不确定这是否正确,如果有几个元素的值是401,怎么办?
要删除多个值,请尝试此操作
1 2 3 4
| while (($key = array_search($del_val, $messages)) !== false)
{
unset($messages[$key]);
} |
借鉴了下划线JS uureject的逻辑,创建了两个函数(人们更喜欢函数!!)
array_reject_value:此函数只是拒绝指定的值(也适用于php4、5、7)
1 2 3 4 5 6 7 8 9 10 11
| function array_reject_value (array &$arrayToFilter, $deleteValue) {
$filteredArray = array();
foreach ($arrayToFilter as $key => $value) {
if ($value !== $deleteValue) {
$filteredArray[] = $value;
}
}
return $filteredArray;
} |
array_reject:此函数只是拒绝可调用方法(适用于php>=5.3)
1 2 3 4 5 6 7 8 9 10 11 12
| function array_reject (array &$arrayToFilter, callable $rejectCallback) {
$filteredArray = array();
foreach ($arrayToFilter as $key => $value) {
if (!$rejectCallback($value, $key)) {
$filteredArray[] = $value;
}
}
return $filteredArray;
} |
因此,在当前的示例中,我们可以使用以下函数:
1 2
| $messages = [312, 401, 1599, 3, 6];
$messages = array_reject_value($messages, 401); |
或者更好:(因为这给了我们一个更好的语法,可以像数组过滤器一样使用)
1 2 3 4
| $messages = [312, 401, 1599, 3, 6];
$messages = array_reject($messages, function ($value) {
return $value === 401;
}); |
上面的内容可以用于更复杂的事情,比如说,我们想删除所有大于或等于401的值,我们可以简单地做到:
1 2 3 4 5
| $messages = [312, 401, 1599, 3, 6];
$greaterOrEqualThan = 401;
$messages = array_reject($messages, function ($value) use $greaterOrEqualThan {
return $value >= $greaterOrEqualThan;
}); |
- 这不是在重新设计过滤器吗?php.net/manual/en/function.array-filter.php
- 是的。正如我在文章中所说,"或者更好:(因为这给了我们一个更好的语法,可以像数组过滤器一样使用)"。有时,您只需要将函数reject设置为下划线,它实际上与过滤器正好相反(您需要使用尽可能少的代码来获取它)。这就是函数的作用。这是拒绝值的简单方法。
用array_search()拿到钥匙。
- 我如何删除if the value and only if i find search _恩与阵列?
- 搜索(K =美元_针阵列haystack美元,美元,美元,True);if(k!虚假unset)= {([ K ] haystack美元美元);}
@Bojangles的回答确实帮助了我。谢谢您。
在我的例子中,数组可以是关联的,也可以不是关联的,所以我添加了这个函数
1 2 3 4 5 6 7 8 9 10 11 12 13
| function test ($value, $tab) {
if(($key = array_search($value, $tab)) !== false) {
unset($tab[$key]); return true;
} else if (array_key_exists($value, $tab)){
unset($tab[$value]); return true;
} else {
return false; // the $value is not in the array $tab
}
} |
当做
单行代码(由于array_diff(),使用以下代码:
如果要删除的值位于或可以位于数组中。使用数组diff函数。似乎对这样的事情很有用。
阿雷耶夫迪夫
1
| $arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove); |
好啊。。我知道这一点效率都不高,但简单、直观、易读。因此,如果有人正在寻找一个不那么花哨的解决方案,可以扩展到使用更多值或更具体的条件。下面是一个简单的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| $result = array();
$del_value = 401;
//$del_values = array(... all the values you don`t wont);
foreach($arr as $key =>$value){
if ($value !== $del_value){
$result[$key] = $value;
}
//if(!in_array($value, $del_values)){
// $result[$key] = $value;
//}
//if($this->validete($value)){
// $result[$key] = $value;
//}
}
return $result |
根据您的要求,"每个值只能存在一次",如果您只想在数组中保留唯一的值,那么array_unique()可能就是您要查找的。
输入:
结果:
1 2 3 4
| array(2) {
[0] => int (4)
[2] => string (1)"3"
} |
接受的答案会将数组转换为关联数组,因此,如果要将它与接受的答案保持为非关联数组,则可能还必须使用array_values。
参考资料在这里
或者使用or操作符的一个线性:
如果你不知道它的钥匙,这意味着它无关紧要。
您可以将该值作为键,这意味着它将立即找到该值。比在所有元素中反复使用搜索更好。
1 2 3 4 5 6 7
| $messages=array();
$messages[312] = 312;
$messages[401] = 401;
$messages[1599] = 1599;
$messages[3] = 3;
unset($messages[3]); // no search needed |
您可以引用此URL:为了功能
1 2 3 4 5 6 7 8
| array -diff -key()
<?php
$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8);
var_dump(array_diff_key($array1, $array2));
?> |
那么输出应该是,
1 2 3 4 5 6
| array(2) {
["red"]=>
int (2)
["purple"]=>
int (4)
} |
另一个删除数组值的方法是使用数组diff。
1 2
| $my_array = array(1=>"a","second_value"=>"b", 3=>"c","d");
$new_array_without_value_c = array_diff($my_array, array("c")); |
(文档:http://php.net/manual/fr/function.array-diff.php)