PHP Conference Japan 2024

array_replace

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

array_replace將傳入陣列的元素替換到第一個陣列中

說明

array_replace(陣列 $array, 陣列 ...$replacements): 陣列

array_replace() 會建立一個新的陣列,並為每個提供的陣列中的每個鍵值指派項目。如果一個鍵值出現在多個輸入陣列中,則會使用最右邊輸入陣列的值。

array_replace() 不會遞迴處理元素項目,它會在執行替換時替換每個鍵值的整個值。

參數

array

要替換元素的陣列。

replacements

要提取元素的陣列。後面的陣列中的值會覆蓋先前的值。

回傳值

回傳一個 陣列

範例

範例 #1 array_replace() 範例

<?php
$base
= array("orange", "banana", "apple", "raspberry");
$replacements = array(0 => "pineapple", 4 => "cherry");
$replacements2 = array(0 => "grape");

$basket = array_replace($base, $replacements, $replacements2);
var_dump($basket);
?>

上述範例會輸出:

array(5) {
  [0]=>
  string(5) "grape"
  [1]=>
  string(6) "banana"
  [2]=>
  string(5) "apple"
  [3]=>
  string(9) "raspberry"
  [4]=>
  string(6) "cherry"
}

範例 #2 巢狀陣列的處理範例

<?php
$base
= [ 'citrus' => [ 'orange', 'lemon' ], 'pome' => [ 'apple' ] ];
$replacements = [ 'citrus' => [ 'grapefruit' ] ];
$replacements2 = [ 'citrus' => [ 'kumquat', 'citron' ], 'pome' => [ 'loquat' ] ];

$basket = array_replace($base, $replacements, $replacements2);
var_dump($basket);
?>

上述範例會輸出:

array(2) {
  ["citrus"]=>
  array(2) {
    [0]=>
    string(7) "kumquat"
    [1]=>
    string(6) "citron"
  }
  ["pome"]=>
  array(1) {
    [0]=>
    string(6) "loquat"
  }
}

參見

新增註記

使用者貢獻的註記 14 則註記

steelpandrummer
12 年前
<?php
// 我們只想從一個 CSV 表格產生的大型陣列中擷取選定鍵值 (array_keys) 的輸出
// 這些鍵值的順序可能不同,並且可以選擇性地抑制空值或未使用的值

$values = array
(
'Article'=>'24497',
'Type'=>'LED',
'Socket'=>'E27',
'Dimmable'=>'',
'Wattage'=>'10W'
);

$keys = array_fill_keys(array('Article','Wattage','Dimmable','Type','Foobar'), ''); // 想要的陣列,值為空

$allkeys = array_replace($keys, array_intersect_key($values, $keys)); // 只替換想要的鍵值

$notempty = array_filter($allkeys, 'strlen'); // 使用 strlen 作為回呼函式,0 等於 false

print '<pre>';
print_r($allkeys);
print_r($notempty);

/*
陣列
(
[Article] => 24497
[Wattage] => 10W
[Dimmable] =>
[Type] => LED
[Foobar] =>
)
陣列
(
[Article] => 24497
[Wattage] => 10W
[Type] => LED
)
*/
?>
marvin_elia at web dot de
10 年前
用於替換陣列鍵值的簡單函式。請注意,您必須手動選擇是否覆蓋現有的鍵值。

/**
* @param array $array
* @param array $replacements
* @param boolean $override
* @return array
*/
function array_replace_keys(array $array, array $replacements, $override = false) {
foreach ($replacements as $old => $new) {
if(is_int($new) || is_string($new)){
if(array_key_exists($old, $array)){
if(array_key_exists($new, $array) && $override === false){
continue;
}
$array[$new] = $array[$old];
unset($array[$old]);
}
}
}
return $array;
}
mail at romansklenar dot cz
14 年前
要獲得與 PHP 5.3 完全相同的結果,程式碼中的 foreach 迴圈應該如下所示

<?php
...
$count = func_num_args();

for (
$i = 1; $i < $count; $i++) {
...
}
...
?>

檢查這段程式碼

<?php
$base
= array('id' => NULL, 'login' => NULL, 'credit' => NULL);
$arr1 = array('id' => 2, 'login' => NULL, 'credit' => 5);
$arr2 = array('id' => NULL, 'login' => 'john.doe', 'credit' => 100);
$result = array_replace($base, $arr1, $arr2);

/*
正確輸出:

array(3) {
"id" => NULL
"login" => string(8) "john.doe"
"credit" => int(100)
}

你的輸出:

array(3) {
"id" => int(2)
"login" => NULL
"credit" => int(5)
}
*/
?>

函式 array_replace 會「將傳入陣列的元素替換到第一個陣列中」——這表示從右到左依序將後面的陣列元素覆蓋到第一個陣列。
ali dot sweden19 at yahoo dot com
8 年前
這是一個簡單的 array_replace_keys 函式

/**
* 此函式會將關聯陣列的鍵替換為 keys 陣列中提供的鍵。
*
* @param $array 目標關聯陣列,其中要替換鍵。
* @param $keys 關聯陣列,其中 search key => replace by key,用於替換相應的鍵。
* @return 替換鍵後的陣列
*/
private function array_replace_keys($array, $keys)
{
foreach ($keys as $search => $replace) {
if ( isset($array[$search])) {
$array[$replace] = $array[$search];
unset($array[$search]);
}
}

return $array;
}

// 測試

print_r(array_replace_keys(['one'=>'apple', 'two'=>'orange'], ['one'=>'ett', 'two'=>'tvo']);
// 輸出
array(
'ett'=>'apple',
'tvo'=>'orange'
)
sun at drupal dot org
13 年前
與其呼叫這個函式,通常使用以下方式會更快更簡單

<?php
$array_replaced
= $array2 + $array1;
?>

如果您需要保留參考

<?php
$array2
+= $array1;
?>
polecat at p0lecat dot com
14 年前
我犯了一個新手錯誤 :)

當這個函式被呼叫多次時,它當然會拋出函式重複宣告的錯誤。我編碼的環境從未多次呼叫它,但我在測試中發現了它,這是完整的工作修訂版。 只需要一個簡單的邏輯步驟。

當時 Debian Lenny 的 PHP 5.3 仍不穩定,而且我不知道 array_replace 是否適用於多維陣列,所以我寫了自己的函式。由於這個網站幫助了我很多,我覺得有必要回饋。 :)

<?php
// Polecat 的多維 array_replace 函式
// 會將第二個陣列中的所有資料套用到第一個陣列,保留任何不對應的值不受影響
function polecat_array_replace( array &$array1, array &$array2 ) {
// 這個子函式是一個迭代器,它會無限地迴圈自身,直到它用完所有陣列維度
if( !function_exists('tier_parse') ) {
function
tier_parse( array &$t_array1, array &$t_array2 ) {
foreach (
$t_array2 as $k2 => $v2 ) {
if (
is_array($t_array2[$k2]) ) {
tier_parse($t_array1[$k2], $t_array2[$k2]);
} else {
$t_array1[$k2] = $t_array2[$k2];
}
}
return
$t_array1;
}
}

foreach (
$array2 as $key => $val ) {
if (
is_array($array2[$key]) ) {
tier_parse($array1[$key], $array2[$key]);
} else {
$array1[$key] = $array2[$key];
}
}
return
$array1;
}
?>

〔我還要說明一下〕如果您想將一個單維陣列添加到多維陣列,您只需將多維陣列中相符的內部陣列鍵作為初始引數傳遞,如下所示

<?php
$array1
= array( "berries" => array( "strawberry" => array( "color" => "red", "food" => "desserts"), "dewberry" = array( "color" => "dark violet", "food" => "pies"), );

$array2 = array( "food" => "wine");

$array1["berries"]["dewberry"] = polecat_array_replace($array1["berries"]["dewberry"], $array2);
?>

這會將「dewberry」的「food」值替換為「wine」。

只要階層結構相同,這個函式也能反向操作,將多維陣列加到單維陣列,甚至將二維陣列加到五維陣列。

我希望這能幫助至少一個人,就像我從這個網站獲得的幫助一樣。
gmastro77 at gmail dot com
11 年前
在某些情況下,您可能會從資料庫中得到一個結構化陣列,其中
一個節點如下所示:

<?php
# 隨機節點結構
$arr = array(
'name' => 'some name',
'key2' => 'value2',
'title' => 'some title',
'key4' => 4,
'json' => '[1,0,1,1,0]'
);

# 按指定順序擷取這些鍵值
$keys = array( 'name', 'json', 'title' );
?>

現在假設您想要從 $keys 中擷取 $arr 的值。
假設您在顯示內容時受到指定鍵順序的限制,
例如,將其與 vsprintf 一起使用,您可以使用以下方法

<?php
# 要轉換的字串
$string = "<p>name: %s, json: %s, title: %s</p>";

# 將鍵值翻轉一次,我們會使用它兩次
$keys = array_flip( $keys );

# 從 $arr 取得值
$test = array_intersect_key( $arr, $keys );

# 仍然不夠好
echo vsprintf( $string, $test );
// 輸出 --> name: some name, json: some title, title: [1,0,1,1,0]

# 使用 array_replace 來取得正確的順序並解決問題
$test = array_replace( $keys, $test );

# 正確的輸出
echo vsprintf( $string, $test );
// 輸出 --> name: some name, json: [1,0,1,1,0], title: some title

?>

我希望這可以節省某人的時間。
kyberprizrak
10 年前
if(!function_exists('array_replace'))
{
function array_replace()
{
$args = func_get_args();
$num_args = func_num_args();
$res = array();
for($i=0; $i<$num_args; $i++)
{
if(is_array($args[$i]))
{
foreach($args[$i] as $key => $val)
{
$res[$key] = $val;
}
}
else
{
trigger_error(__FUNCTION__ .'(): 參數 #'.($i+1).' 不是陣列', E_USER_WARNING);
return NULL;
}
}
return $res;
}
}
vlk dot charles at gmail dot com
7 個月前
我認為值得一提的是,作為第一個參數傳遞的陣列並未被修改,並且保持完整。會返回一個新的陣列。我認為這份文件的措辭可以改進,因為它暗示了傳遞的陣列 *被* 修改了。

如果您想修改現有的陣列,僅執行以下操作是不夠的

array_replace($arrayToModify, $arrayWithModifications);

您必須將返回的值重新賦值給它,如下所示

$arrayToModify = array_replace($arrayToModify, $arrayWithModifications);
lm713
10 年前
如果陣列是關聯式的(也就是說,它們的鍵是字串),那麼我相信這個函式與(較舊的)array_merge 相同。
ricardophp yahoocombr
2 年前
關於以下斷言
如果您想將第二個陣列的陣列元素附加到第一個陣列,同時不覆蓋第一個陣列的元素並且不重新索引,請使用 + 陣列聯集運算子

釐清事實(意思是…)
如果第一個陣列有一個鍵和一個值,它不會被新陣列覆蓋。因此,如果您有一個像 [1=>"alpha", 2=>"beta"] 這樣的陣列,並且您得到一個新的陣列 [1=>"Alpha", 3=>"Gamma"],那麼最終的陣列將是 [1=>"alpha", 2=>"beta", 3=>"Gamma"]。第一個陣列的值在結果陣列中不會被修改。

因此,如果您正在構建一個連接陣列,其中值有時會覆蓋彼此的鍵,並且您必須保留值,則最好使用 array_merge 而不是「加號」
projacore at gmail dot com
9 年前
您也可以使用

<?php
$myarray
= [
"Orange",
"572" => "Banana",
"omg" => "Chili",
"nevermind" => "mango"
];

$myarray[0] = "NO-Orange";
$myarray["572"] = "BANANAPHONE!!!";
$myarray["omg"] = "NO-Chili";

print_r($myarray);

?>

結果
陣列
(
[0] => NO-Orange
[572] => BANANAPHONE!!!
[omg] => NO-Chili
[nevermind] => mango
)

此致
polecat at p0lecat dot com
14 年前
我想補充我之前關於 polecat_array_replace 函式的說明,如果您想將一個單維陣列添加到多維陣列中,您只需將多維陣列中匹配的內部陣列鍵作為初始參數傳遞,如下所示

$array1 = array( "berries" => array( "strawberry" => array( "color" => "red", "food" => "desserts"), "dewberry" => array( "color" => "dark violet", "food" => "pies"), );

$array2 = array( "food" => "wine");

$array1["berries"]["dewberry"] = polecat_array_replace($array1["berries"]["dewberry"], $array2);

這會將「dewberry」的「food」值替換為「wine」。

只要階層結構相同,這個函式也能反向操作,將多維陣列加到單維陣列,甚至將二維陣列加到五維陣列。

我希望這能幫助至少一個人,就像我從這個網站獲得的幫助一樣。
匿名
9 年前
該文件的措辭有誤:「array_replace() 會取代 array1 的值」 並沒有進行取代。 而是創建了一個新的陣列,看起來就像執行所描述的取代後會產生的結果。

如果您想擴充陣列中的索引集,請使用
array_to_be_modified += array_with_indices_to_add;
To Top