天天看點

PHP 數組的合并與運算

作者:寒笛過霜天

array_combine() 建立一個數組,用一個數組的值作為其鍵名,另一個數組的值作為其值

array array_combine ( array $keys , array $values )

$a1=array("OS","WebServer","DataBase","Language"); //聲明第一個數組作為參數1
$a2=array("Linux","Apache","MySQL","PHP"); //聲明第二個數組作為參數2
print_r(array_combine($a1,$a2)); //使用arrray_combine()将兩個數組合并
//輸出:Array ( [OS] => Linux [WebServer] => Apache [DataBase] => MySQL [Language] => PHP )           

array_merge() 合并一個或多個數組

array array_merge ( array $array1 [, array $array2 [, array $... ]] )

array_merge() 将一個或多個數組的單元合并起來, 一個數組中的值附加在前一個數組的後面。傳回作為結果的數組。

在數組值相同的情況下, 如果輸入的數組中有相同的字元串鍵名,則該鍵名後面的值将覆寫前一個值。

然而, 如果數組包含數字鍵名, 後面的值将不會覆寫原來的值, 而是附加到後面, 并為其重建數字索引。

如果隻給了一個數組并且該數組是數字索引的, 則鍵名會以連續方式重新索引。 如果是唯一的字元串鍵名, 則保留鍵名。

如果關聯數組和索引數組混合的, 則為索引數組重建索引, 關聯數組的則保留鍵名;

//關聯數組的鍵名相同的,則後面的值覆寫前一個值
$a1=array("a"=>"Linux","b"=>"Apache");
$a2=array("c"=>"MySQL","b"=>"PHP");
print_r(array_merge($a1,$a2)); //輸出: Array ( [a] => Linux [b] => PHP [c] => MySQL )
           
//沒有鍵名的數組,則為其重建索引
$a1=array("a"=>"Linux","Apache");
$a2=array("c"=>"MySQL","PHP");
print_r(array_merge($a1,$a2)); //輸出:Array ( [a] => Linux [0] => Apache [c] => MySQL [1] => PHP )
           
//沒有鍵名的數組且值相同,則為其重建索引,保留重複的值
$a1=array("a"=>"Linux","Apache");
$a2=array("c"=>"MySQL","php","Apache");
print_r(array_merge($a1,$a2)); //輸出:Array ( [a] => Linux [0] => Apache [c] => MySQL [1] => php [2] => Apache )           
//僅使用一個數組參數則鍵名以0開始進行重新索引
$a=array(3=>"PHP",4=>"MySQL");
print_r(array_merge($a)); //輸出:Array ( [0] => PHP [1] => MySQL )           
//索引數組的鍵名相同的,則重建索引
$a1=array("a"=>"Linux",1=>"Apache");
$a2=array("c"=>"MySQL",1=>"PHP");
print_r(array_merge($a1,$a2)); //輸出:Array ( [a] => Linux [0] => Apache [c] => MySQL [1] => PHP )           
//索引數組的鍵名相同的且鍵名相同的,則不會覆寫,重建索引
$a1=array("a"=>"Linux",1=>"Apache");
$a2=array("c"=>"MySQL",1=>"Apache");
print_r(array_merge($a1,$a2));//輸出:Array ( [a] => Linux [0] => Apache [c] => MySQL [1] => Apache )
           

歸納: 關聯數組的鍵名相同的, 後者覆寫前者, 且後者的鍵名保留;

索引數組的鍵名相同的, 會重建索引(原索引鍵名不保留), 不會出現覆寫;

索引名相同的情況下如何合并數組(避免同一個鍵名相同的情況下, 直接修改鍵值的問題)?

<?php
function array_add($a,$b){
$arr = array_intersect_key($a, $b);
foreach($b as $key=>$value){
if(!array_key_exists($key, $a)){
$a[$key]=$value;
}
}
foreach($arr as $key=>$value){
$a[$key]=$a[$key]+$b[$key];
}
return $a;
}
$a = array('0'=>'2','1'=>'4','3'=>'8','a'=>'100');
$b = array('0'=>'5','2'=>'4','b'=>'33','a'=>'22');
$arr=array_add($a,$b);
echo "<pre>";
print_r($arr);
echo "</pre>";
Array
(
[0] => 7
[1] => 4
[3] => 8
[a] => 122
[2] => 4
[b] => 33
)           

注意:array_merge(array_merge(array1,array2,array3...))

三個參數必須為數組否則的話, 出現會錯誤, 是以在使用之前必須向判斷是否是數組is_array();

使用運算符對數組進行合并

<?php
//聲明兩個數組,前兩個元素下标相同,測試是否後面的會覆寫前面的
$a = array( "a"=>"Linux", "b"=>"Apache");
$b = array( "a"=>"PHP", "b"=>"MySQL", "c"=>"web" );

$c = $a + $b; //使用“+”合并兩個數組,$a在前, $b在後,因為前兩個下标相同, $b會覆寫
echo "合并後的 \$a 和 \$b: \n";
print_r($c); //結果: Array ( [a] => Linux [b] => Apache [c] => web )

$c = $b + $a; //使用“+”合并兩個數組,$b在前, $a在後,因為前兩個下标相同, $a會覆寫
echo "合并後的 \$a 和 \$b: \n";
print_r($c); //結果: Array ( [a] => PHP [b] => MySQL [c] => web )           

歸納:對于索引數組, 不會重建索引(原鍵名保留);

對于關聯數組, 鍵名也會保留;

鍵名相同的(索引數組和關聯數組), 前者覆寫後者;

執行個體:array_merge()和運算符号"+"的比較

<?php
$a = array(1=>"a", 2=>"b", 3=>"c", "min"=>"f", "max"=>"j");
$b = array(2=>"e", 4=>"d", 5=>"c", "min"=>"h", "max"=>"j");
$c = $a + $b;
print_r($c);
echo "<br>";
$d = array_merge($a, $b);
print_r($d);
?>           

輸出結果:

Array ( [1] => a [2] => b [3] => c [min] => f [max] => j [4] => d [5] => c )
Array ( [0] => a [1] => b [2] => c [min] => h [max] => j [3] => e [4] => d [5] => c )           

注意: print_r()函數在輸出時, 自動為沒有鍵名的元素添加數組索引後再輸出;

數組的比較(==或===)

== 等于:

判斷數組的長度是否相等

判斷數組的索引下标是否相等

判斷數組的值是否相等(不判斷資料類型)

=== 恒等于:

判斷數組的長度是否相等

判斷數組的索引下标與索引順序是否相等

判斷數組的值是否相等, 還需要判斷資料類型

<?php
$arr1 = array(1, 2, 3, 4);
$arr2 = array('a'=>1, 'b'=>2, 'c'=>3, 'd'=>4);
$arr3 = array('10'=>'1,2,3,4');
$arr4 = array('3'=>4,'2'=>3,'1'=>2,'0'=>1);
$arr5 = array('0'=>1,'1'=>2,'2'=>3,'3'=>4);
var_dump($arr1 == $arr2); //false
echo "<hr/>";
var_dump($arr1 == $arr4); //true
echo "<hr/>";
var_dump($arr1 == $arr5); //true
echo "<hr/>";
var_dump($arr1 === $arr4); //false
echo "<hr/>";
var_dump($arr1 === $arr5); //true

?>           

拆分、分解函數見array_slice()和array_splice()的差別

array_intersect() 計算數組的交集

array array_intersect ( array $array1 , array $array2 [, array $ ... ] )

array_intersect() 傳回一個數組, 該數組包含了所有在 array1 中也同時出現在所有其它參數數組中的值。注意鍵名保留不變。

$array1 = array("a" => "green", "red", "blue");
$array2 = array("b" => "green", "yellow", "red");
$result = array_intersect($array1, $array2);
Array
(
[a] => green
[0] => red
)           

array_diff() 計算數組的差集

array array_diff ( array $array1 , array $array2 [, array $ ... ] )

array_diff() 傳回一個數組,該數組包括了所有在 array1 中但是不在任何其它參數數組中的值。注意鍵名保留不變。

$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);
print_r($result);
Array
(
[1] => blue
)           

array_intersect_assoc() 帶索引檢查計算數組的交集

array array_intersect_assoc ( array $array1 , array $array2 [, array $ ... ] )

注意: 此函數為沒有鍵名的元素重建數字索引,其傳回值為鍵名相同的元素(包括數字索引的鍵名不相同的,則不傳回)

<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "b" => "yellow", "blue", "red");
$result_array = array_intersect_assoc($array1, $array2);
print_r($result_array);
?>           

輸出結果:

Array
(
[a] => green
)           

array_diff_assoc() 帶索引檢查計算數組的差集

array array_diff_assoc ( array $array1 , array $array2 [, array $... ] )

注意: 此函數為沒有鍵名的元素重建數字索引,其傳回值為鍵名不相同的元素(包括數字索引的鍵名不相同的,則也傳回)

<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "yellow", "red");
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>           

輸出結果:

Array
(
[b] => brown
[c] => blue
[0] => red //包含重建數字索引的鍵名
)           

以上計算數組的交集和差集傳回值會保留原有的鍵名(包括為其重建數字索引元素的鍵名也保留)