php合並數組並去重
⑴ php如何刪除兩個數組中相同的元素
首先,我看到這個問題中描述是「如何刪除兩個數組中相同的元素」,雖然那個人寫了一大堆,竟然用的是array_unique(),從分析到給出的demo一直在解決如何刪除「一個」數組中「重復」的元素。汗!答非所問的答案竟然會被採納。
這里,簡單分析一下提問者的真實意圖,分以下2種情況:
1.現在有2個一維數組, $arr1和$arr2,現在要刪除 $arr1 中存在於 $arr2 的元素。
解決方案:使用array_diff對比返回在 array1 中但是不在 array2 及任何其它參數數組中的值,代碼如下:
<?php
$arr1=array(1,2,3,4);
$arr2=array(2,4);
//這一句即可
$arr1=array_diff($arr1,$arr2);
var_mp($arr1);
2.先聲明一下,我看了lt318025大神給出的答案,他的思維非常活躍,已經分了2種情況。
現在有2個一維數組,$a和$b,即刪除$a中存在於$b的元素,刪除$b中$a存在的元素,組後合並返回。
可是lt318025大神用的PHP版本太高,給出的demo在低版本PHP下運行失敗,這里修正一下:
<?php
$a=array(1,2,3);
$b=array(2,3,4);
//得到存在於$a但不存在於$b中的元素組成的數組
$c=array_diff($a,$b);
//這里簡單求出在$a但不在$b中的元素
var_mp($c);
//得到存在於$a但不存在於$b中的元素組成的數組與存在於$b但不存在於$a中的元素組成的數組的並集
$d=array_merge(array_diff($a,$b),array_diff($b,$a));
//這里徹底剔除了同時存在於$a和$b中的元素
var_mp($d);
究竟是哪一種情況,這需要看提問者的需求了。
⑵ php 一個2維數組中有對象,怎麼過濾多個數組中重復數據,整合為一個數組(里有對象及數據)
先將所有數據放到一旦渣個數組里
$arr_new_str =Array();//放字元串的數組
$arr_new_obj = Array();//放對象的數組
foreach( $arr_old as $arr_in ){
foreach( $arr_in as $value){
//雙重遍歷,開始 將字陵迅符串和對象分開
if( $value instanceof stdClass )
{ //所有對象
$arr_new_obj[] =$value;
}else {//所有字元串
$arr_new_str[]=$value;
}
}
}
//array_unique()函數,我不清楚能不能排除對象,所以我又分了一次
$arr_new= array_unique( $arr_new_str );
//驗證對象
$count = count( $arr_new_obj);
for( $i=0;$i<$count;$i++){
//得到對象數組的第一個值,
for($j=$i+1;$j<$count;$j++){
//尺遲此將第一個對象和其他值比較,
if( $arr_new_obj[ i ] == $arr_new_obj[ j ] ){
//相等,就將第一個刪除;依次類推
unset( $arr_new_obj[ i ] );
}
}
}
//最後得到的就是沒有相同對象的新數組
//和並兩個數組;
$array_new = array_merge( $arr_new ,$arr_new_obj );
//array_merge() 函數把兩個或多個數組合並為一個數組。
//如果鍵名有重復,該鍵的鍵值為最後一個鍵名對應的值(後面的覆蓋前面的)。如果數組是數
//字索引的,則鍵名會以連續方式重新索引。
這個題,我認為 難在如何判斷兩個對象是否相等,我也是,網路了一下,才知道的,請樓主也學習一下;
我的方法比較長,我看一樓 用到的 遞歸,水準比我高多了,學習了
⑶ php 去掉完全相同的重復數組
一、這個沒有被合並,只是取的後面這個鍵名的值,
二、$input=array("11"=>"aaaa","22"=>"bbbb","33"=>"cccc","11"=>"aaada","44"=>"cccc1","55"=>"cccc");
$result
=
array_unique
($input);
print_r($result);
輸出的結果:Array
(
[11]
=>
aaada
[22]
=>
bbbb
[33]
=>
cccc
[44]
=>
cccc1
)
鍵名33
和
55
的值完全一樣的時候,後者會被幹掉
如果你要的是鍵名和值完全一致的時候才刪除一個的話,似乎不能,因為鍵名是不允許重復的
聽你的情況似乎數據量很大,建議你使用
array_flip()函數
【php中,刪除數組中重復元素有一個可用的函數,那就是array_unique(),
但是它並不是一個最高效的方法,使用array_flip()函數將比array_uniqure()在速度上高出五倍左右。】
例子:$input=array("11"=>"aaaa","22"=>"bbbb","33"=>"cccc","11"=>"aaada","44"=>"cccc1","55"=>"cccc");
$arr1
=
array_flip(array_flip($input));
print_r($arr1);
輸出的結果:Array
(
[11]
=>
aaada
[22]
=>
bbbb
[55]
=>
cccc
[44]
=>
cccc1
)
⑷ 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如何合並數組當中有相同數值的數組
array_unique函數提供了過濾重復的值的功能,但是該函數只能處理一維數組,如果遇到多維數組我們可以現將其轉化為一維數組。示例代碼如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*
* $data 是你要處理數據
* $result 是輸出的結果
*/
//將其轉化為一維數組
foreach ($data as &$row) {
$row = serialize($row);
}
unset($row);
$data = array_unique($data);
//還原多維數組
foreach ($data as &$row) {
$row = unserialize($row);
}
unset($row);
不好意思 樓主要求,我看錯了,追加下面的代碼
1
2
3
4
5
6
7
8
9
10
11
12
$result=array();
$tmp_arr=array();
foreach ($data as $row) {
$tmp_arr[$row['confuguarable_sku']][] = $row['size'];
}
//將尺寸用逗號拼接
foreach ($tmp_arr as $sku => $size) {
$result[] = array('confuguarable_sku'=>$sku, 'size'=>implode(",", $size));
}
echo "<pre>";
//輸出結果
print_r($result);
⑹ php 大數組合並去重 兩個數組元素都過萬
過萬沒關系,如果一個數組內容佔一個機器字長,1萬才10K WORD而已,現在機器內存很大,幾千萬都瞬間就處理完了,完全可以按照一般方法編程。
一般方法的合並數組,要看小標是0、1、2、....還是其它的關鍵字,相同下標的合並還是相同值的合並,具體細節有區別,流程都是一樣的:兩次for each把兩個數組的內容添加到新數組裡面。
⑺ 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
// 刪除數組中相同元碼蘆素,只保留一個相同元素
function formatArray($array)
{
sort($array);
$tem = "";
$temarray = array();
$j = 0;
for($i=0;$i<count($array);$i++)
{
if($array[$i]!=$tem)
{
$temarray[$j] = $array[$i];
$j++;
}
$tem = $array[$i];
}
return $temarray;
}
//測試 調用函碧模態數
$array = array('悔源aa','bb','aa',3,4,5,5,5,5,'bc');
$arr = formatArray($array);
print_r($arr);
?>
⑼ 【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下將多個數組合並成一個數組的方法與實例代碼
1.合並數組
array_merge()函數將數組合並到一起,返回一個聯合的數組。所得到的數組以第一個輸入數組參數開始,按後面數組參數出現的順序依次迫加。其形式為:
復制代碼
代碼如下:
array
array_merge
(array
array1
array2…,arrayN)
將一個或多個數組的單元合並起來,一個數組中的值附加在前一個數組的後面。返回作為結果的數組。
如果輸入的數組中有相同的字元串鍵名,則該鍵名後面的值將覆蓋前一個值。然而,如果數組包含數字鍵名,後面的值將不會覆蓋原來的值,而是附加到後面。
如果只給了一個數組並且該數組是數字索引的,則鍵名會以連續方式重新索引。
實例如下:
復制代碼
代碼如下:
$face
=
array("J","Q","K","A");
$numbered
=
array("2","3","4","5","6","7","8","9");
$cards
=
array_merge($face,
$numbered);
shuffle($cards);
print_r($cards);
這將返回如下所示的結果,運行代碼:
復制代碼
代碼如下:
Array
(
[0]
=>
A
[1]
=>
4
[2]
=>
9
[3]
=>
3
[4]
=>
K
[5]
=>
7
[6]
=>
5
[7]
=>
Q
[8]
=>
6
[9]
=>
8
[10]
=>
2
[11]
=>
J
)
2.遞歸追加數組
array_merge_recursive()函數與array_merge()相同,可以將兩個或多個數組合並在一起,形成一個聯合的數組.兩者之間的區別在於,當某個輸入數組中的某個鍵己經存在於結果數組中時該函數會採取不同的處理方式.array_merge()會覆蓋前面存在的鍵/值對,替換為當前輸入數組中的鍵/值對,而array_merge_recursive()將把兩個值合並在一起,形成一個新的數組,並以原有的鍵作為數組名。還有一個數組合並的形式,就是遞歸追加數組。其形式為:
view
sourceprint?array
array_merge_recursive(
array
key,array
values
)
示例如下:
復制代碼
代碼如下:
$class1
=
array("John"
=>
100,
"James"
=>
85);
$class2
=
array("Micky"
=>
78,
"John"
=>
45);
$classScores
=
array_merge_recursive($class1,
$class2);
print_r($classScores);
這將返回如下結果:
view
sourceprint?Array
(
[John]
=>
Array
(
[0]
=>
100
[1]
=>
45
)
[James]
=>
85
[Micky]
=>
78
)
3.連接兩個數組
array_combine()函數會得到一個新數組,它由一組提交的鍵和對應的值組成。其形式為:
view
sourceprint?array
array_merge(array
array1,array
array2[…,array
arrayN])
注意,兩個輸入數組必須大小相同,不能為空。示例如下:
復制代碼
代碼如下:
$abbreviations
=
array("AL","AK","AZ","AR");
$states
=
array("Alabama","Alaska","Arizona","Arkansas");
$stateMap
=
array_combine($abbreviations,$states);
print_r($stateMap);
這會返回:
復制代碼
代碼如下:
Array
(
[AL]
=>
Alabama
[AK]
=>
Alaska
[AZ]
=>
Arizona
[AR]
=>
Arkansas
)