Answers:
使用array_search()
和unset
,尝试以下操作:
if (($key = array_search($del_val, $messages)) !== false) {
unset($messages[$key]);
}
array_search()
返回找到的元素的键,可使用将键从原始数组中删除该元素unset()
。如果FALSE
失败,它将返回,但是如果成功,它将返回false -y值(0
例如,您的密钥),这就是为什么使用严格比较运算符的原因!==
。
该if()
语句将检查是否array_search()
返回了值,并且只会执行一个操作。
array_diff()
因为它会比较慢比较两个数组,而不是简单的通过搜索一个样array_search()
。
$key
是0
什么呢?
0
或其他任何假值,则不会取消设置该值,并且您的代码也将无法工作。你应该测试一下$key === false
。(编辑-您知道了)
好吧,从数组中删除一个元素基本上只是与一个元素设置不同。
array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]
概括性很好,如果需要,您可以同时删除任意多个元素。
免责声明:请注意,我的解决方案会生成一个数组的新副本,同时保持旧副本不变,这与接受的变异答案相反。选择您需要的那个。
[$element]
,而是使用了array($element)
。没什么大不了的,只是想让任何有类似问题的人知道他们并不孤单
array_diff
将(string) $elem1 === (string) $elem2
其用作相等条件,而不是$elem1 === $elem2
您期望的那样。@ nischayn22指出的问题是由此导致的。如果您希望将某些东西用作可用于任意元素数组(可能是对象)的实用函数,则出于这个原因,Bojangle的答案可能会更好。
array_diff()
,因此将运行时从O(n)推到O(n lg n)。
一种有趣的方法是使用array_keys()
:
foreach (array_keys($messages, 401, true) as $key) {
unset($messages[$key]);
}
该array_keys()
函数使用两个附加参数来仅返回特定值的键以及是否需要严格检查(即,使用===进行比较)。
这也可以删除具有相同值的多个数组项(例如[1, 2, 3, 3, 4]
)。
array_values()
;其余键仍然在同一顺序的,所以从技术上讲不是“无序”
$fields = array_flip($fields);
unset($fields['myvalue']);
$fields = array_flip($fields);
看一下下面的代码:
$arr = array('nice_item', 'remove_me', 'another_liked_item', 'remove_me_also');
你可以做:
$arr = array_diff($arr, array('remove_me', 'remove_me_also'));
这将为您提供以下数组:
array('nice_item', 'another_liked_item')
最好的方法是 array_splice
array_splice($array, array_search(58, $array ), 1);
[1, 2, 4 => 3]
。
3
,数组将是[1, 2, 3]
; 换句话说,该值未删除。明确地说,我并不是说它在所有情况下都会失败,仅此一种。
或者简单地,手动方式:
foreach ($array as $key => $value){
if ($value == $target_value) {
unset($array[$key]);
}
}
这是最安全的方法,因为您可以完全控制阵列
array_splice()
代替unset()
也会重新排列数组索引,在这种情况下可能会更好。
通过以下代码,重复值将从$ messages中删除。
$messages = array_diff($messages, array(401));
如果您有PHP 5.3+
,则只有一行代码:
$array = array_filter($array, function ($i) use ($value) { return $i !== $value; });
$value
,所以实际上它已被放入一个微型类使您可以访问$value
封闭内....
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 )
你可以做:
unset($messages[array_flip($messages)['401']]);
说明:401
翻转数组后,删除具有键的元素。
401
?
要删除多个值,请尝试以下一项:
while (($key = array_search($del_val, $messages)) !== false)
{
unset($messages[$key]);
}
借用了underscore.JS _.reject的逻辑,并创建了两个函数(人们更喜欢函数!)
array_reject_value:该函数只是拒绝指定的值(也适用于PHP4、5、7)
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)
function array_reject(array &$arrayToFilter, callable $rejectCallback) {
$filteredArray = array();
foreach ($arrayToFilter as $key => $value) {
if (!$rejectCallback($value, $key)) {
$filteredArray[] = $value;
}
}
return $filteredArray;
}
因此,在当前示例中,我们可以按以下方式使用上述功能:
$messages = [312, 401, 1599, 3, 6];
$messages = array_reject_value($messages, 401);
甚至更好:(因为这给了我们更好的语法,就像array_filter一样)
$messages = [312, 401, 1599, 3, 6];
$messages = array_reject($messages, function ($value) {
return $value === 401;
});
上面的代码可以用于更复杂的东西,比如说我们想删除所有大于或等于401的值,我们可以简单地做到这一点:
$messages = [312, 401, 1599, 3, 6];
$greaterOrEqualThan = 401;
$messages = array_reject($messages, function ($value) use $greaterOrEqualThan {
return $value >= $greaterOrEqualThan;
});
@Bojangles的回答确实帮助了我。谢谢。
就我而言,数组可以是关联的,也可以不是关联的,所以我添加了以下函数
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()),请使用以下代码:
$messages = array_diff($messages, array(401));
根据您的要求,“ 每个值只能存在一次 ”,如果您只想在数组中保留唯一值,那么array_unique()
可能就是您想要的。
输入:
$input = array(4, "4", "3", 4, 3, "3");
$result = array_unique($input);
var_dump($result);
结果:
array(2) {
[0] => int(4)
[2] => string(1) "3"
}
如果要删除的值位于或可以位于数组中。使用array_diff函数。似乎对这种事情很有用。
$arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove);
我知道这根本不是高效的,而是简单,直观且易于阅读。
因此,如果有人正在寻找一种不太理想的解决方案,可以将其扩展为使用更多值或更特定的条件,那么这是一个简单的代码:
$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_search()
。
如果您不知道它的密钥,那就意味着它无关紧要。
您可以将值作为键,这意味着它将立即找到值。胜过一次又一次地搜索所有元素。
$messages=array();
$messages[312] = 312;
$messages[401] = 401;
$messages[1599] = 1599;
$messages[3] = 3;
unset($messages[3]); // no search needed
您可以参考以下网址:以获取功能
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));
?>
然后输出应该是
array(2) {
["red"]=>
int(2)
["purple"]=>
int(4)
}
删除数组值的另一个想法是使用array_diff。如果我想
$my_array = array(1=>"a", "second_value"=>"b", 3=>"c", "d");
$new_array_without_value_c = array_diff($my_array, array("c"));
我认为最简单的方法是使用带有foreach循环的函数:
//This functions deletes the elements of an array $original that are equivalent to the value $del_val
//The function works by reference, which means that the actual array used as parameter will be modified.
function delete_value(&$original, $del_val)
{
//make a copy of the original, to avoid problems of modifying an array that is being currently iterated through
$copy = $original;
foreach ($original as $key => $value)
{
//for each value evaluate if it is equivalent to the one to be deleted, and if it is capture its key name.
if($del_val === $value) $del_key[] = $key;
};
//If there was a value found, delete all its instances
if($del_key !== null)
{
foreach ($del_key as $dk_i)
{
unset($original[$dk_i]);
};
//optional reordering of the keys. WARNING: only use it with arrays with numeric indexes!
/*
$copy = $original;
$original = array();
foreach ($copy as $value) {
$original[] = $value;
};
*/
//the value was found and deleted
return true;
};
//The value was not found, nothing was deleted
return false;
};
$original = array(0,1,2,3,4,5,6,7,4);
$del_val = 4;
var_dump($original);
delete_value($original, $del_val);
var_dump($original);
输出将是:
array(9) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(2)
[3]=>
int(3)
[4]=>
int(4)
[5]=>
int(5)
[6]=>
int(6)
[7]=>
int(7)
[8]=>
int(4)
}
array(7) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(2)
[3]=>
int(3)
[5]=>
int(5)
[6]=>
int(6)
[7]=>
int(7)
}