php陣列比對 - php陣列重組
按數值刪除PHP數組(不是鍵) (17)
@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
}
}
問候
我有一個PHP數組,如下所示:
$messages = [312, 401, 1599, 3, ...];
我想刪除包含值$del_val
的元素(例如$del_val=401
),但我不知道它的關鍵。 這可能有所幫助: 每個值只能出現一次 。
我正在尋找最簡單的功能來執行此任務。
一個有趣的方法是使用array_keys()
:
foreach (array_keys($messages, 401, true) as $key) {
unset($messages[$key]);
}
array_keys()
函數需要兩個附加參數才能返回特定值的密鑰以及是否需要嚴格檢查(即使用===進行比較)。
這也可以刪除具有相同值的多個數組項(例如[1, 2, 3, 3, 4]
)。
你可以參考這個URL :for function
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()
並unset
,請嘗試以下操作:
if (($key = array_search($del_val, $messages)) !== false) {
unset($messages[$key]);
}
array_search()
返回它找到的元素的鍵,它可以用來使用unset()
從原始數組中刪除該元素。 它會在失敗時返回FALSE
,但是它可以在成功時返回false-y值(例如,您的密鑰可能為0
),這就是使用嚴格比較!==
運算符的原因。
if()
語句將檢查array_search()
是否返回值,並且只會執行一個操作。
借用下劃線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;
});
另一個想法是刪除一個數組的值,使用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 : http://php.net/manual/fr/function.array-diff.php )
好的..我知道這樣做效率不高,但它很簡單,直觀且易於閱讀。
因此,如果有人正在尋找一種不太適合的解決方案,可以將其擴展到更多價值或更具體的條件下,這裡有一個簡單的代碼:
$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
如果你有> php5.3,有一行代碼:
$array = array_filter($array, function($i) use ($value){return $i != $value;});
如果您要刪除的值是或可以位於數組中。 使用array_diff函數。 似乎很適合這樣的事情。
$arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove);
或者簡單地說,手動方式:
foreach ($array as $key => $value){
if ($value == $target_value) {
unset($array[$key]);
}
}
這是最安全的,因為您可以完全控制陣列
接受的答案將數組轉換為關聯數組,因此,如果您想將其作為非關聯數組與接受的答案保持一致,則可能必須使用array_values
。
if(($key = array_search($del_val, $messages)) !== false) {
unset($messages[$key]);
$arr = array_values($messages);
}
here是參考
根據你的要求,“ 每個值只能存在一次 ”,如果你只是想在你的數組中保存唯一的值,那麼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"
}
看看下面的代碼:
$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')
通過以下代碼,重複值將從$ messages中刪除。
$messages = array_diff($messages, array(401));
那麼,從數組中刪除一個元素基本上只是設置與一個元素的差異。
array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]
它很好地概括,你可以同時刪除盡可能多的元素,如果你想。
免責聲明:請注意,我的解決方案會生成數組的新副本,同時保持原有數據不變,而與接受的變體相反。 因為這個可能會慢一點。
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 )