php數組的操作(合并,拆分,刪除,排序)
1. 合并數組
array_merge ( array $array1 [, array $... ] )
array_merge() 將一個或多個數組的單元合并起來,一個數組中的值附加在前一個數組的后面。返回作為結果的數組。
如果輸入的數組中有相同的字符串鍵名,則該鍵名后面的值將覆蓋前一個值。然而,如果數組包含數字鍵名,后面的值將不會覆蓋原來的值,而是附加到后面。
如果只給了一個數組并且該數組是數字索引的,則鍵名會以連續方式重新索引
對比: 如果你想完全保留原有數組并只想新的數組附加到后面,用 + 運算符:
<?php
$array1 = array(0 => 'zero_a', 2 => 'two_a', 3 => 'three_a');
$array2 = array(1 => 'one_b', 3 => 'three_b', 4 => 'four_b');
$result = $array1 + $array2;
var_dump($result);
?>
第一個數組的鍵名將會被保留。在兩個數組中存在相同的鍵名時,第一個數組中的同鍵名的元素將會被保留,第二個數組中的元素將會被忽略,輸出為:
array(5) {
[0]=>
string(6) "zero_a"
[2]=>
string(5) "two_a"
[3]=>
string(7) "three_a"
[1]=>
string(5) "one_b"
[4]=>
string(6) "four_b"
}
array_combine ( array $keys , array $values )
返回一個 array,用來自 keys 數組的值作為鍵名,來自 values 數組的值作為相應的值。
2. 遞歸地合并數組(追加數組)
array array_merge_recursive ( array $array1 [, array $... ] )
array_merge_recursive() 將一個或多個數組的單元合并起來,一個數組中的值附加在前一個數組的后面。返回作為結果的數組。
如果輸入的數組中有相同的字符串鍵名,則這些值會被合并到一個數組中去,這將遞歸下去,因此如果一個值本身是一個數組,本函數將按照相應的條目把它合并為另一個數組。然而,如果數組具有相同的數組鍵名,后一個值將不會覆蓋原來的值,而是附加到后面。
array_merge 和 array_merge_recursive都是合并數組,區別在于:當某個輸入數組的某個字符串鍵名已經存在要合并的初始數組中時,兩個函數會采取不同的處理方式。array_merge()會覆蓋前面存在的鍵值對,而array_merge_recursive()將兩個值合并在一起行成新的數組,并以原有的鍵作為數組鍵名
官網的例子:
<?php
$ar1 = array("color" => array("favorite" => "red"), 5);
$ar2 = array(10, "color" => array("favorite" => "green", "blue"));
$result = array_merge_recursive($ar1, $ar2);
print_r($result);
?>
輸出:
Array
(
[color] => Array
(
[favorite] => Array
(
[0] => red
[1] => green
)
[0] => blue
)
[0] => 5
[1] => 10
)
3.數組元素的替換
array array_replace ( array $array1 , array $array2 [, array $... ] )
array_replace() 函數使用后面數組元素相同 key 的值替換 array1 數組的值。如果一個鍵存在于第一個數組同時也存在于第二個數組,它的值將被第二個數組中的值替換。如果一個鍵存在于第二個數組,但是不存在于第一個數組,則會在第一個數組中創建這個元素。如果一個鍵僅存在于第一個數組,它將保持不變。如果傳遞了多個替換數組,它們將被按順序依次處理,后面的數組將覆蓋之前的值。
array_replace() 是非遞歸的:它將第一個數組的值進行替換而不管第二個數組中是什么類型。
同樣也有遞歸替換array_replace_recursive
array array_replace_recursive ( array $array1 , array $array2 [, array $... ] )
array_replace_recursive() 使用后面數組元素的值替換數組 array1 的值。 如果一個鍵存在于第一個數組同時也存在于第二個數組,它的值將被第二個數組中的值替換。 如果一個鍵存在于第二個數組,但是不存在于第一個數組,則會在第一個數組中創建這個元素。 如果一個鍵僅存在于第一個數組,它將保持不變。 如果傳遞了多個替換數組,它們將被按順序依次處理,后面的數組將覆蓋之前的值。
**上面這段話描述了三種情況:
- 被替換數組和替換數組存在相同的鍵,被替換數組中對應的值將被替換
- 被替換數組中獨有的鍵不受影響
- 替換數組中獨有的鍵不會影響被替換數組
**
array_replace_recursive() 是遞歸的:它將遍歷數組并將相同的處理應用到數組的內部值。
如果數組 array1 中的值是標量,它的值將被第二個數組 array2 中的值替換,它可能是一個標量或者數組。如果 array1 和 array2 中的值都是數組,array_replace_recursive() 函數將遞歸地替換它們各自的值。
<?php
$base = array('citrus' => array( "orange") , 'berries' => array("blackberry", "raspberry"), );
$replacements = array('citrus' => array('pineapple'), 'berries' => array('blueberry'));
$basket = array_replace_recursive($base, $replacements);
print_r($basket);
$basket = array_replace($base, $replacements);
print_r($basket);
?>
//輸出:
Array
(
[citrus] => Array
(
[0] => pineapple
)
[berries] => Array
(
[0] => blueberry
[1] => raspberry
)
)
Array
(
[citrus] => Array
(
[0] => pineapple
)
[berries] => Array
(
[0] => blueberry
)
)
Example #2 array_replace_recursive() 及其遞歸表現
<?php
$base = array('citrus' => array("orange") , 'berries' => array("blackberry", "raspberry"), 'others' => 'banana' );
$replacements = array('citrus' => 'pineapple', 'berries' => array('blueberry'), 'others' => array('litchis'));
$replacements2 = array('citrus' => array('pineapple'), 'berries' => array('blueberry'), 'others' => 'litchis');
$basket = array_replace_recursive($base, $replacements, $replacements2);
print_r($basket);
?>
//輸出:
Array
(
[citrus] => Array
(
[0] => pineapple
)
[berries] => Array
(
[0] => blueberry
[1] => raspberry
)
[others] => litchis
)
4. 拆分數組
array_slice ( array $array , int $offset [, int $length = NULL [, bool $preserve_keys = false ]] )
array_slice() 返回根據 offset 和 length 參數所指定的 array 數組中的一段序列。
其中offset 和 length 都可為負數。php系統函數的規律:這種情況正數表示順序,負數表示位置。
對比: array_splice — 去掉數組中的某一部分并用其它值取代
array_splice ( array &$input , int $offset [, int $length = count($input) [, mixed $replacement = array() ]] )
把 input 數組中由 offset 和 length 指定的單元去掉,如果提供了 replacement 參數,則用其中的單元取代。
注意 input 中的數字鍵名不被保留。