php合並數組去重
❶ 數組去重的5種方法
數組去重的5種方法:
方法一:
雙重for循環去重
原理 兩兩比較如果相等的話就刪除第二個
例如: 1 1 1 3 2 1 2 4
先讓第一個1 即arr[0]與後面的一個個比較 如果後面的值等於arr[0] 刪除後面的值
第一次結束後的結果是 1 3 2 2 4 刪除了後面所有的1
同理 第二次 第三會刪除與自己相同的元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function noRepeat1(arr){
// 第一層for用來控制循環的次數
for(var i=0; i<arr.length; i++){
//第二層for 用於控制與第一層比較的元素
for(var j=i+1; j<arr.length; j++){
//如果相等
if(arr[i] == arr[j]){
//刪除後面的 即第 j個位置上的元素 刪除個數 1 個
arr.splice(j,1);
// j--很關鍵的一步 如果刪除 程序就會出錯
//j--的原因是 每次使用splice刪除元素時 返回的是一個新的數組
// 這意味這數組下次遍歷是 比較市跳過了一個元素
/*
例如: 第一次刪除後 返回的是 1 1 3 2 1 2 4
* 但是第二次遍歷是 j的值為2 arr[2] = 3
* 相當於跳過一個元素 因此要 j--
* */
j--;
}
}
}
return arr;
}
方法二:
單層for循環
原理和方法一相似
1
2
3
4
5
6
7
8
9
10
11
12
13
function norepeat(arr){
arr.sort();
//先排序讓大概相同的在一個位置,這里為什麼說是大概相同 是因為sort排序是把元素當字元串排序的 它和可能排成 1 1 10 11 2 20 3 ... 不是我們想要的從小到大
for(var i = 0; i < arr.length-1;i++){
//還是兩兩比較 一樣刪除後面的
if(arr[i]==arr[i+1]){
arr.splice(i,1);
//i-- 和j--同理
i--;
}
}
return arr;
}
方法三:
原理:用一個空數組去存首次出現的元素
利用 indexOf 屬性 indexOf是返回某個指定的字元在字元串中出現的位置,如果沒有就會返回-1
因此我們可以很好的利用這個屬性 當返回的是 -1時 就讓其存入數組
1
2
3
4
5
6
7
8
9
function noRepeat2(arr){
var newArr = [];
for(var i = 0; i < arr.length; i++){
if(newArr.indexOf(arr[i]) == -1){
newArr.push(arr[i]);
}
}
return newArr;
}
方法四:
原理:利用對象的思想,如果對象里沒有這個屬性的話就會返回undefined
利用這個原理當返回的是undefined時讓其放入數組然後在給這個屬性賦值
1
2
3
4
5
6
7
8
9
10
11
function norepeat3(arr) {
var obj = {};
var newArr = [];
for(var i = 0; i < arr.length; i++) {
if(obj[arr[i]] == undefined) {
newArr.push(arr[i]);
obj[arr[i]] = 1;
}
}
return newArr;
}
方法五:
原理:循環比較如果相等的讓後面的元素值為0,最後在輸出的時候刪除為0的這個前提是你的數據里不能有0,但是凡事可以變通你可以設置任何值替代這個0,這個方法是我當時想到實現的所以沒有進行很好的優化。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var newArr = [];
//控制外循環
for(var i=0; i<arr.length-1;i++){
//內存循環 只比較後面的
for(j=i+1;j<arr.length;j++){
//如果相等就讓其值等於0
if(arr[i]==arr[j]){
arr[j]=0;
}
}
//去除值為0的
if(arr[i]==0){
continue;
}else{
//放入新的數組
newArr.push(arr[i]);
}
}
推薦教程:《php視頻教程》
以上就是數組去重的5種方法有哪些?的詳細內容,更多請關注php中文網其它相關文章!
❷ php數組去除重復的值
之前寫了一篇關於數組去重的文章,但是僅限於一維數組。下面的函數可以用於二維數組:
//二維數組去掉重復值
function array_unique_fb($array2D){foreach ($array2D as $v){$v = join(",",$v); //降維,也可以用implode,將一維數組轉換為用逗號連接的字元串
$temp[] = $v;}
$temp = array_unique($temp); //去掉重復的字元串,也就是重復的一維數組
foreach ($temp as $k => $v){$temp[$k] = explode(",",$v); //再將拆開的數組重新組裝}return $temp;}
如果你想保留數組的鍵值,可以用下面的函數:
//二維數組去掉重復值 並保留鍵值
function array_unique_fb($array2D){foreach ($array2D as $k=>$v){$v = join(",",$v); //降維,也可以用implode,將一維數組轉換為用逗號連接的字元串
$temp[$k] = $v;}$temp = array_unique($temp); //去掉重復的字元串,也就是重復的一維數組
foreach ($temp as $k => $v){$array=explode(",",$v); //再將拆開的數組重新組裝
$temp2[$k]["id"] =$array[0];
$temp2[$k]["litpic"] =$array[1];
$temp2[$k]["title"] =$array[2];
$temp2[$k]["address"] =$array[3];
$temp2[$k]["starttime"] =$array[4];
$temp2[$k]["endtime"] =$array[5];
$temp2[$k]["classid"] =$array[6];
大概就這樣啦。
以上回答你滿意么?
❸ PHP合並數組幾種方式總結
PHP 中的 array_merge()、array_merge_recursive()函數可以實現
array_merge() 函數把兩個或多個數組合並為一個數組。
如果鍵名有重復,該鍵的鍵值為最後一個鍵名對應的值(後面的覆蓋前面的)。如果數組是數字索引的,則鍵名會以連續方式重新索引。
注意:如果僅僅向 array_merge() 函數輸入了一個數組,且鍵名是整數,則該函數將返回帶有整數鍵名的新數組,其鍵名以 0 開始進行重新索引。
array_merge(array1,array2,array3...)
參數說明
array1 必需。輸入的第一個數組。
array2 必需。輸入的第二個數組。
array3 可選。可指定的多個輸入數組。
例如:
<?php
$a1=array("a"=>"Horse","b"=>"Dog");
$a2=array("c"=>"Cow","b"=>"Cat");
print_r(array_merge($a1,$a2));
?>
輸出:
Array ( [a] => Horse [b] => Cat [c] => Cow )
僅使用一個數組參數:
<?php
$a=array(3=>"Horse",4=>"Dog");
print_r(array_merge($a));
?>
輸出:
Array ( [0] => Horse [1] => Dog )
array_merge_recursive() 函數與array_merge()函數不同的是,當有重復的鍵名時,值不會被覆蓋,而是將多個相同鍵名的值遞歸組成一個數組。
例如:
<?php
$a1=array("a"=>"Horse","b"=>"Dog");
$a2=array("c"=>"Cow","b"=>"Cat");
print_r(array_merge_recursive($a1,$a2));
?>
輸出:
Array (
[a] => Horse
[b] => Array ( [0] => Dog [1] => Cat )
[c] => Cow
)
❹ php 多個一維關聯數組去重
因為不太了解你其他業務,這里通過對多個數組觀察發現,他們的鍵名都是一致的。所以有2個簡單的辦法
(1)先翻轉一維數組,然後進行合並,再翻轉回來
這里就不寫詳細代碼,寫下簡單過程
$array_a =array_flip($array_a);
這樣交換後的數組內容如下
Array
(
[DHL] =>carrier
)Array
(
[HKPT] =>carrier
)....
合並數組,使用array_merge,數組中有相同的字元串鍵名,則該鍵名後面的值將覆蓋前一個值
$mergeArray = array_merge($array_a,$array_b,$array_c...);
這樣得到一個數組,裡面的元素都是鍵名不重復的,內容如下
Array
(
[DHL] =>carrier
[HKPT] =>carrier
....
)
還原數組,這里如果要完全打散成一個一個的一維數組,就直接array_shift,同時翻轉回來
$array_a =array_shift($mergeArray);$array_a =array_flip($array_a);
$array_b =array_shift($mergeArray);$array_b=array_flip($array_b);
...
這里一個一個執行可以用for循環替代,數組中有多少個元素就執行多少次,
(2)最簡單的辦法,只從你提供的例子來說,鍵名都一樣,直接先去掉鍵名,然後組合成一個數字索引的數組,直接array-unique,再把鍵名放回去
如果有不清楚可以發消息
❺ PHP二維數組如何實現去除重復項
PHP數組去除重復項有個內置函數array_unique(),但是php的array_unique函數只適用於一維數組,對多維數組並不適用,不過你可以在二維數組中的值,用array_unique()即可。
比如:
$array = array(array(1,1,2),array(2,3,4,3));
$temp_array = array();
foreach($array as $key=>$value){
$temp_array[$key] = array_unique($value);
}
$array = $temp_array;
❻ 【php】合並多個數組並去掉相同的
你是要把$tpid數組的內容合並嗎,可以先弄了一個空數組,for裡面歸並到這個空數組,for結束之後進行唯一處理,大致邏輯如下:
<?php
$result=Array();
for($i=0;$i<$num;$i++){
$tpid=$data[$i]['busitype'];
$tpid=explode(".",$tpid,-1);
print_r($tpid);
echo
"<br>";
$result=array_merge($result,$tpid);
}
$result=array_unique($result);
?>
補充:
那是array_merge的問題,重復的下標會被合並,你試試看使用array_merge_recursive吧,我無法測試程序,沒有你的數據。
❼ php數組怎麼去除重復的數組值
array_unique() 函數定義和用法
移除數組中的重復的值,並返回結果數組。
當幾個數組元素的值相等時,只保留第一個元素,其他的元素被刪除。
返回的數組中鍵名不變。
<?php
$a=array("a"=>"XX","b"=>"D","c"=>"XX");
print_r(array_unique($a));
?>
輸出:Array ( [a] => XX [b] => D)
❽ php裡面如何合並數組
可以使用函數array_merge();
❾ php 大數組合並去重 兩個數組元素都過萬
過萬沒關系,如果一個數組內容佔一個機器字長,1萬才10K WORD而已,現在機器內存很大,幾千萬都瞬間就處理完了,完全可以按照一般方法編程。
一般方法的合並數組,要看小標是0、1、2、....還是其它的關鍵字,相同下標的合並還是相同值的合並,具體細節有區別,流程都是一樣的:兩次for each把兩個數組的內容添加到新數組裡面。
❿ 關於php 數組合並去重問題
你的數組源一看就不是php數組!! 轉化後的結構也不是php數組。
php數據結構是 array(key => value); 而且在php數組中,如果有重復的key,則value值會覆蓋之前的數據。