我有一个PHP数组如下:
$messages = [312, 401, 1599, 3, ...];
Run Code Online (Sandbox Code Playgroud)
我想删除包含值的元素$del_val(例如$del_val=401),但我不知道它的键.这可能会有所帮助:每个值只能存在一次.
我正在寻找最简单的功能来执行此任务.
Boj*_*les 1468
使用array_search()和unset,尝试以下方法:
if (($key = array_search($del_val, $messages)) !== false) {
unset($messages[$key]);
}
Run Code Online (Sandbox Code Playgroud)
array_search()返回它找到的元素的键,可以用来从原始数组中删除该元素unset().它将FALSE在失败时返回,但是它可以在成功时返回false-y值(0例如,您的密钥可能是),这就是使用严格比较运算符的原因!==.
该if()语句将检查是否array_search()返回值,并且只会执行操作.
Rok*_*alj 616
好吧,从数组中删除一个元素基本上只是设置一个元素的差异.
array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]
Run Code Online (Sandbox Code Playgroud)
它很好地概括,如果你愿意,你可以同时删除任意数量的元素.
免责声明:请注意,我的解决方案会生成一个新的数组副本,同时保持旧数据的完整性与已接受的答案相反.由于这个原因,它可能会有点慢.
Ja͢*_*͢ck 106
一个有趣的方法是使用array_keys():
foreach (array_keys($messages, 401, true) as $key) {
unset($messages[$key]);
}
Run Code Online (Sandbox Code Playgroud)
该array_keys()函数需要两个附加参数来仅返回特定值的键以及是否需要严格检查(即使用===进行比较).
这也可以删除具有相同值的多个数组项(例如[1, 2, 3, 3, 4]).
adl*_*son 51
如果您确定您的数组只包含一个具有该值的元素,那么您可以这样做
$key = array_search($del_val, $array);
if (false !== $key) {
unset($array[$key]);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您的值可能在阵列中出现多次,则可以执行此操作
$array = array_filter($array, function($e) use ($del_val) {
return ($e !== $del_val);
});
Run Code Online (Sandbox Code Playgroud)
注意:第二个选项仅适用于带有闭包的 PHP5.3 +
Rma*_*nnn 39
$fields = array_flip($fields);
unset($fields['myvalue']);
$fields = array_flip($fields);
Run Code Online (Sandbox Code Playgroud)
the*_*ine 27
看看下面的代码:
$arr = array('nice_item', 'remove_me', 'another_liked_item', 'remove_me_also');
Run Code Online (Sandbox Code Playgroud)
你可以做:
$arr = array_diff($arr, array('remove_me', 'remove_me_also'));
Run Code Online (Sandbox Code Playgroud)
这会得到你这个数组:
array('nice_item', 'another_liked_item')
Run Code Online (Sandbox Code Playgroud)
Abd*_*rai 21
最好的方法是 array_splice
array_splice($array, array_search(58, $array ), 1);
Run Code Online (Sandbox Code Playgroud)
Sye*_*man 19
By the following code, the repetitive values will be removed from the $messages.
$messages = array_diff($messages, array(401));
小智 18
或者简单地说,手动方式:
foreach ($array as $key => $value){
if ($value == $target_value) {
unset($array[$key]);
}
}
Run Code Online (Sandbox Code Playgroud)
这是最安全的,因为您可以完全控制阵列
Dav*_*Lin 15
如果您有> php5.3,则有一行代码:
$array = array_filter($array, function ($i) use ($value) { return $i !== $value; });
Run Code Online (Sandbox Code Playgroud)
Roy*_*Roy 14
在 PHP 7.4 中使用箭头函数:
$messages = array_filter($messages, fn ($m) => $m != $del_val);
Run Code Online (Sandbox Code Playgroud)
为了保持它是一个非关联数组,用array_values()以下内容包装它:
$messages = array_values(array_filter($messages, fn ($m) => $m != $del_val));
Run Code Online (Sandbox Code Playgroud)
ttt*_*ony 13
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);
Run Code Online (Sandbox Code Playgroud)
产量
Array ( [0] => 312 [1] => 1599 [2] => 3 )
Kou*_*Das 13
PHP 7.4 或更高版本
function delArrValues(array $arr, array $remove) {
return array_filter($arr, fn($e) => !in_array($e, $remove));
};
Run Code Online (Sandbox Code Playgroud)
所以,如果你有数组
$messages = [312, 401, 1599, 3];
Run Code Online (Sandbox Code Playgroud)
并且您想3, 312从 $messages 数组中删除两者,您可以这样做
delArrValues($messages, [3, 312])
Run Code Online (Sandbox Code Playgroud)
它会返回
[401, 1599]
Run Code Online (Sandbox Code Playgroud)
最好的部分是您可以轻松过滤多个值,即使同一值多次出现。
Qur*_*shi 11
你可以做:
unset($messages[array_flip($messages)['401']]);
Run Code Online (Sandbox Code Playgroud)
说明:401翻转数组后删除具有该键的元素.
要删除多个值,请尝试此操作
while (($key = array_search($del_val, $messages)) !== false)
{
unset($messages[$key]);
}
Run Code Online (Sandbox Code Playgroud)
如果您不知道其密钥,则意味着它并不重要。
您可以将值作为键,这意味着它会立即找到该值。比一遍又一遍地在所有元素中使用搜索要好。
$messages=array();
$messages[312] = 312;
$messages[401] = 401;
$messages[1599] = 1599;
$messages[3] = 3;
unset($messages[3]); // no search needed
Run Code Online (Sandbox Code Playgroud)
接受的答案将数组转换为关联数组,因此,如果您想将其保留为与接受的答案的非关联数组,您可能也必须使用array_values。
if(($key = array_search($del_val, $messages)) !== false) {
unset($messages[$key]);
$arr = array_values($messages);
}
Run Code Online (Sandbox Code Playgroud)
参考在这里
借用下划线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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
所以在我们当前的例子中,我们可以使用上面的函数如下:
$messages = [312, 401, 1599, 3, 6];
$messages = array_reject_value($messages, 401);
Run Code Online (Sandbox Code Playgroud)
甚至更好:(因为这给了我们一个更好的语法来使用像array_filter一样)
$messages = [312, 401, 1599, 3, 6];
$messages = array_reject($messages, function ($value) {
return $value === 401;
});
Run Code Online (Sandbox Code Playgroud)
以上内容可以用于更复杂的内容,比如我们想要删除大于或等于401的所有值,我们可以简单地执行此操作:
$messages = [312, 401, 1599, 3, 6];
$greaterOrEqualThan = 401;
$messages = array_reject($messages, function ($value) use $greaterOrEqualThan {
return $value >= $greaterOrEqualThan;
});
Run Code Online (Sandbox Code Playgroud)