我有一个PHP数组如下:
$messages = [312, 401, 1599, 3, ...];
我想删除包含值 $del_val 的元素(例如, $del_val=401 ),但我不知道它的键 . 这可能会有所帮助: each value can only be there once .
$del_val
$del_val=401
我正在寻找最简单的功能来执行此任务 .
$fields = array_flip($fields); unset($fields['myvalue']); $fields = array_flip($fields);
要删除多个值,请尝试使用此值
while (($key = array_search($del_val, $messages)) !== false) { unset($messages[$key]); }
如果要删除的值是或可以在数组中 . 使用array_diff函数 . 似乎很适合这样的事情 .
array_diff
$arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove);
@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 } }
问候
如果您有> php5.3,则有一行代码:
$array = array_filter($array, function($i) use ($value){return $i != $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);
Output
Array ( [0] => 312 [1] => 1599 [2] => 3 )
使用array_search()和unset,尝试以下操作:
if (($key = array_search($del_val, $messages)) !== false) { unset($messages[$key]); }
array_search() 返回它找到的元素的键,可以使用 unset() 从原始数组中删除该元素 . 它将在失败时返回 FALSE ,但是它可以在成功时返回false-y值(例如,您的密钥可能是 0 ),这就是使用严格比较 !== 运算符的原因 .
array_search()
unset()
FALSE
0
!==
if() 语句将检查 array_search() 是否返回了值,并且只会执行操作 .
if()
或者简单地说,手动方式:
foreach ($array as $key => $value){ if ($value == $target_value) { unset($array[$key]); } }
这是最安全的,因为您可以完全控制阵列
如果您确定您的数组将只包含一个具有该值的元素,那么您可以这样做
$key = array_search($del_val, $array); if (false !== $key) { unset($array[$key]); }
但是,如果您的值在阵列中可能出现多次,则可以执行此操作
$array = array_filter($array, function($e) use ($del_val) { return ($e !== $del_val); });
Note: 第二个选项仅适用于带有Closures的PHP5.3
好的..我知道这根本不高效,但简单,直观且易于阅读 .因此,如果有人正在寻找一个不那么花哨的解决方案,可以扩展到更多的值或更具体的条件 . 这里有一个简单的代码:
$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
如果你不知道它的关键,那就意味着无关紧要 .
您可以将值作为键,这意味着它将立即找到值 . 比一遍又一遍地使用所有元素中的搜索更好 .
$messages=array(); $messages[312] = 312; $messages[401] = 401; $messages[1599] = 1599; $messages[3] = 3; unset($messages[3]); // no search needed
通过以下代码,重复值将从$ messages中删除 .
$messages = array_diff($messages, array(401));
借用了下划线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; });
根据您的要求“ each value can only be there once ”,如果您只想保留数组中的唯一值,那么array_unique()可能就是您所需要的 .
Input:
$input = array(4, "4", "3", 4, 3, "3"); $result = array_unique($input); var_dump($result);
Result:
array(2) { [0] => int(4) [2] => string(1) "3" }
你可以做:
unset($messages[array_flip($messages)['401']]);
说明:在翻转数组后删除具有键 401 的元素 .
401
最好的方式是array_splice
array_splice($array, array_search(58, $array ), 1);
最佳原因在于http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-array-in-php/
或使用 or 运算符的单行:
or
($key = array_search($del_val, $messages)) !== false or unset($messages[$key]);
接受的答案是将数组转换为关联数组,因此,如果您希望将其保留为具有接受答案的非关联数组,则可能还必须使用 array_values .
array_values
if(($key = array_search($del_val, $messages)) !== false) { unset($messages[$key]); $arr = array_values($messages); }
参考是here
删除数组值的另一个想法是使用array_diff . 如果我想
$my_array = array(1=>"a", "second_value"=>"b", 3=>"c", "d"); $new_array_without_value_c = array_diff($my_array, array("c"));
(Doc:http://php.net/manual/fr/function.array-diff.php)
你可以参考这个URL:用于功能
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_search()的密钥 .
单线代码(感谢array_diff()),使用以下内容:
一个有趣的方法是使用array_keys():
foreach (array_keys($messages, 401, true) as $key) { unset($messages[$key]); }
array_keys()函数需要两个附加参数来仅返回特定值的键以及是否需要严格检查(即使用===进行比较) .
这也可以删除具有相同值的多个数组项(例如 [1, 2, 3, 3, 4] ) .
[1, 2, 3, 3, 4]
看看下面的代码:
$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_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]
它很好地概括,如果你愿意,你可以同时删除任意数量的元素 .
免责声明:请注意,我的解决方案会生成一个新的数组副本,同时保持旧数据的完整性与已接受的应答变异形成对比 . 由于这个原因,它可能会有点慢 .
25 回答
要删除多个值,请尝试使用此值
如果要删除的值是或可以在数组中 . 使用array_diff函数 . 似乎很适合这样的事情 .
array_diff
@Bojangles的答案对我有帮助 . 谢谢 .
在我的例子中,数组可以是关联的,所以我添加了这个函数
问候
如果您有> php5.3,则有一行代码:
Output
Array ( [0] => 312 [1] => 1599 [2] => 3 )
使用array_search()和unset,尝试以下操作:
array_search()
返回它找到的元素的键,可以使用unset()
从原始数组中删除该元素 . 它将在失败时返回FALSE
,但是它可以在成功时返回false-y值(例如,您的密钥可能是0
),这就是使用严格比较!==
运算符的原因 .if()
语句将检查array_search()
是否返回了值,并且只会执行操作 .或者简单地说,手动方式:
这是最安全的,因为您可以完全控制阵列
如果您确定您的数组将只包含一个具有该值的元素,那么您可以这样做
但是,如果您的值在阵列中可能出现多次,则可以执行此操作
Note: 第二个选项仅适用于带有Closures的PHP5.3
好的..我知道这根本不高效,但简单,直观且易于阅读 .
因此,如果有人正在寻找一个不那么花哨的解决方案,可以扩展到更多的值或更具体的条件 . 这里有一个简单的代码:
如果你不知道它的关键,那就意味着无关紧要 .
您可以将值作为键,这意味着它将立即找到值 . 比一遍又一遍地使用所有元素中的搜索更好 .
通过以下代码,重复值将从$ messages中删除 .
$messages = array_diff($messages, array(401));
借用了下划线JS _.reject的逻辑并创建了两个函数(人们更喜欢函数!!)
array_reject_value: 此函数只是拒绝指定的值(也适用于PHP4,5,7)
array_reject: 此函数只是拒绝可调用方法(适用于PHP> = 5.3)
所以在我们当前的例子中我们可以使用上面的函数如下:
甚至更好:(因为这给我们提供了更好的语法,比如array_filter)
以上内容可以用于更复杂的内容,比如我们想要删除大于或等于401的所有值,我们可以简单地执行此操作:
根据您的要求“ each value can only be there once ”,如果您只想保留数组中的唯一值,那么array_unique()可能就是您所需要的 .
Input:
Result:
你可以做:
说明:在翻转数组后删除具有键
401
的元素 .最好的方式是array_splice
最佳原因在于http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-array-in-php/
或使用
or
运算符的单行:接受的答案是将数组转换为关联数组,因此,如果您希望将其保留为具有接受答案的非关联数组,则可能还必须使用
array_values
.参考是here
删除数组值的另一个想法是使用array_diff . 如果我想
(Doc:http://php.net/manual/fr/function.array-diff.php)
你可以参考这个URL:用于功能
那么输出应该是,
获取array_search()的密钥 .
单线代码(感谢array_diff()),使用以下内容:
一个有趣的方法是使用array_keys():
array_keys()函数需要两个附加参数来仅返回特定值的键以及是否需要严格检查(即使用===进行比较) .
这也可以删除具有相同值的多个数组项(例如
[1, 2, 3, 3, 4]
) .看看下面的代码:
你可以做:
这会得到你这个数组:
好吧,从数组中删除一个元素基本上只是设置一个元素的差异 .
它很好地概括,如果你愿意,你可以同时删除任意数量的元素 .
免责声明:请注意,我的解决方案会生成一个新的数组副本,同时保持旧数据的完整性与已接受的应答变异形成对比 . 由于这个原因,它可能会有点慢 .