PHP Conference Japan 2024

array_combine

(PHP 5, PHP 7, PHP 8)

array_combine使用一個陣列作為鍵,另一個陣列作為其值來建立陣列

描述

array_combine(array $keys, array $values): array

使用來自 keys 陣列的值作為鍵,並使用來自 values 陣列的值作為對應的值,來建立一個 array

參數

keys

要使用的鍵的陣列。鍵的非法值會被轉換為 string

values

要使用的值的 Array

傳回值

傳回合併的 array

錯誤/例外

從 PHP 8.0.0 開始,如果 keysvalues 中的元素數量不符,則會拋出 ValueError。 在 PHP 8.0.0 之前,則會發出 E_WARNING

變更日誌

版本 描述
8.0.0 如果每個陣列的元素數量不相等,array_combine() 現在會拋出 ValueError;先前此函式會改為傳回 false

範例

範例 #1 一個簡單的 array_combine() 範例

<?php
$a
= array('green', 'red', 'yellow');
$b = array('avocado', 'apple', 'banana');
$c = array_combine($a, $b);

print_r($c);
?>

以上範例將會輸出

Array
(
    [green]  => avocado
    [red]    => apple
    [yellow] => banana
)

另請參閱

新增註解

使用者貢獻的註解 13 個註解

117
loureirorg at gmail dot com
11 年前
如果兩個鍵相同,則第二個鍵優先。

範例
<?php
print_r
(array_combine(Array('a','a','b'), Array(1,2,3)));
?>
傳回
陣列
(
[a] => 2
[b] => 3
)

但是,如果您需要保留所有值,則可以使用以下函式

<?php
function array_combine_($keys, $values)
{
$result = array();
foreach (
$keys as $i => $k) {
$result[$k][] = $values[$i];
}
array_walk($result, create_function('&$v', '$v = (count($v) == 1)? array_pop($v): $v;'));
return
$result;
}

print_r(array_combine_(Array('a','a','b'), Array(1,2,3)));
?>
傳回
陣列
(
[a] => 陣列
(
[0] => 1
[1] => 2
)

[b] => 3
)
14
welcome at el hyphen mustafa
9 年前
關於 loreiorg 的腳本
為了在合併陣列時保留重複的鍵。

我修改了腳本以使用閉包而非 create_function

原因:請參閱文件中關於 create_function 中標出的安全性問題

<?php

function array_combine_($keys, $values){
$result = array();

foreach (
$keys as $i => $k) {
$result[$k][] = $values[$i];
}

array_walk($result, function(&$v){
$v = (count($v) == 1) ? array_pop($v): $v;
});

return
$result;
}

?>
13
claude dot pache at gmail dot com
14 年前
array_combine() 有一個奇怪的錯誤/缺失功能(截至 PHP 5.3.2):沒有邏輯理由可以讓 <? array_combine(array(), array()) ?> 拋出警告並傳回 FALSE,而不是傳回 <? array() ?> (請參閱 http://bugs.php.net/bug.php?id=34857)。 這是一個快速的變通方法
<?php
function array_real_combine($a, $b)
{
return
$a===array() && $b===array() ? array() : array_combine($a, $b);
}
?>
13
quecoder at gmail
16 年前
<?php
// 如果它們的大小不相同,這裡有一個解決方案:

$abbreviations = array("AL", "AK", "AZ", "AR", "TX", "CA");
$states = array("Alabama", "Alaska", "Arizona", "Arkansas");
function
combine_arr($a, $b)
{
$acount = count($a);
$bcount = count($b);
$size = ($acount > $bcount) ? $bcount : $acount;
$a = array_slice($a, 0, $size);
$b = array_slice($b, 0, $size);
return
array_combine($a, $b);
}
$combined = combine_arr($abbreviations, $states);
print_r($combined);

// 輸出
// Array ( [AL] => Alabama [AK] => Alaska [AZ] => Arizona
// [AR] => Arkansas )
?>
6
zequez at gmail dot com
13 年前
如果兩個鍵相同,則第二個鍵優先。
範例
<?php
print_r
(array_combine(Array('a','a','b'), Array(1,2,3)));
?>
傳回
陣列
(
[a] => 2
[b] => 3
)
3
dejiakala at gmail dot com
13 年前
我需要將 CSV 檔案讀取為關聯陣列,並以欄位標頭作為鍵。然後我遇到一個問題,當一行的末尾有空欄位時,因為如果兩個陣列的元素數量不同,array_combine 會返回 false。這個基於 quecoder at gmail 的 combine_arr() 函數,讓我可以在解析 CSV 為陣列時,選擇是否要填充陣列。
$a 是欄位標頭的陣列,$b 是使用 fgetcsv() 檢索的當前行陣列

<?php

function array_combine_special($a, $b, $pad = TRUE) {
$acount = count($a);
$bcount = count($b);
// $a 中的元素比 $b 多,但我們不想填充任何一個
if (!$pad) {
$size = ($acount > $bcount) ? $bcount : $acount;
$a = array_slice($a, 0, $size);
$b = array_slice($b, 0, $size);
} else {
// 標頭比行欄位多
if ($acount > $bcount) {
$more = $acount - $bcount;
// 第二個陣列末尾缺少多少欄位?
// 添加空字串以確保陣列 $a 和 $b 具有相同的元素數量
$more = $acount - $bcount;
for(
$i = 0; $i < $more; $i++) {
$b[] = "";
}
// 欄位比標頭多
} else if ($acount < $bcount) {
$more = $bcount - $acount;
// 第一個陣列中的元素較少,添加額外的鍵
for($i = 0; $i < $more; $i++) {
$key = 'extra_field_0' . $i;
$a[] = $key;
}

}
}

return
array_combine($a, $b);
}
?>
2
bradentkeith at dot dontspam dot gmail dot com
14 年前
我需要一個函數,可以將一個不等長陣列的鍵與另一個陣列的值組合起來。真實應用
選擇 4 種產品類型。
每種產品都有一個序號。
有 4 組產品。

<?php
function array_combine2($arr1, $arr2) {
$count1 = count($arr1);
$count2 = count($arr2);
$numofloops = $count2/$count1;

$i = 0;
while(
$i < $numofloops){
$arr3 = array_slice($arr2, $count1*$i, $count1);
$arr4[] = array_combine($arr1,$arr3);
$i++;
}

return
$arr4;
}
?>

輸入
陣列
(
[0] => SMART Board
[1] => 投影機
[2] => 喇叭
[3] => 分配器
)
, 陣列
(
[0] => smart board1 的序號
[1] => 投影機 1 的序號
[2] => 喇叭 1 的序號
[3] => 分配器 1 的序號
[4] => smart board 2 的序號
[5] => 投影機 2 的序號
[6] => 喇叭 2 的序號
[7] => 分配器 2 的序號
)

陣列
(
[0] => 陣列
(
[SMART Board] => smart board1 的序號
[投影機] => 投影機 1 的序號
[喇叭] => 喇叭 1 的序號
[分配器] => 分配器 1 的序號
)

[1] => 陣列
(
[SMART Board] => smart board 2 的序號
[投影機] => 投影機 2 的序號
[喇叭] => 喇叭 2 的序號
[分配器] => 分配器 2 的序號
)

)
1
ilanfir at gmail dot com
9 年前
我最近需要反轉一個陣列,並按值將元素分組,這段程式碼將會做到這一點
<?php
function flipAndGroup($input) {
$outArr = array();
array_walk($input, function($value, $key) use (&$outArr) {
if(!isset(
$outArr[$value]) || !is_array($outArr[$value])) {
$outArr[$value] = [];
}
$outArr[$value][] = $key;
});
return
$outArr;
}
?>

範例
<?php
$users_countries
= array(
'username1' => 'US',
'user2' => 'US',
'newuser' => 'GB'
);
print_r(flipAndGroup($users_countries));
?>

返回
陣列
(
[US] => 陣列
(
[0] => username1
[1] => user2
)

[GB] => 陣列
(
[0] => newuser
)
)
-1
info at callismart dot com dot ng
4 個月前
在 PHP 8.0 中,如果每個陣列的元素數量不相等,`array_combine` 會拋出 ValueError 錯誤;

為了更安全起見,您可以先執行檢查。

$arrayk = array( 'key1', 'key2', 'key3' );
$arrayv = array( 'v1', 'v2', 'v3' );

if ( count( $arrayk ) === count( $arrayv ) ) {
echo '<pre>';
var_dump( array_combine( $arrayk, $arrayv ) );
echo '</pre>';
} else {
return false;
}
0
PHPNewbie
7 年前
對某些人來說這可能很明顯,但如果您需要保留重複的鍵(因為您有獨特的變數),您可以將 `array_combine` 反轉,讓變數成為鍵,這樣就會正確輸出。

這個[預設]公式會自動移除重複的鍵。

$i=0;
foreach (array_combine($keys, $vars) as $key => $var)
{
$i=$i;
echo($key);
echo " ";
echo($var);
}

這個公式可以達成相同的效果,而且順序也相同,但重複的「鍵」(現在是變數)會被保留。

$i=0;
foreach (array_combine($vars, $keys) as $var => $key)
{
$i=$i;
echo($key);
echo " ";
echo($var);
}

我知道,我是個新手,但也許其他人最終會需要這個。我找不到其他任何解決方案。
0
g.REMOVETHIS.vincendon AT vithemis.com
12 年前
我當時正在尋找一個可以將陣列組合到多個陣列的函數,用於我的 MySQL `GROUP_CONCAT()` 查詢,所以我製作了這個函數。

<?php
function array_combine_array(array $keys)
{
$arrays = func_get_args();
$keys = array_shift($arrays);

/* 檢查陣列是否為相同模型 (array('INDEX'=> array()) 或 array()) */
$check = count(array_unique(array_map('is_array',array_map('current',$arrays)))) === 1;
if (!
$check) { trigger_error('Function array_combine_array() expects all parameters to be same type array or array of array',E_USER_NOTICE); return array(); }

/* 檢查陣列的模型, array('INDEX' => array()) 或 Array() */
$assocArray = is_array(array_shift(array_map('current',$arrays)));

/* 如果給定的 $Keys 為空,我們將填入一個空的陣列 */
if (empty($keys)) $keys = array_keys(array_fill(0,max(($assocArray) ? array_map('count',array_map('current',$arrays)) : array_map('count',$arrays)),'foo'));

/* 初始化 */
$ret=array();$i=0;
/* 針對每個鍵的值進行循環,為每個值建立一個偏移量 */
foreach($keys as $v)
{
/* 針對陣列進行循環 */
foreach ($arrays as $k)
{
if (
$assocArray)
{
/* 取得元素的索引 */
$key = key($k);
/* 如果偏移量存在,我們將它放置進去 */
$ret[$v][$key] = isset($k[$key][$i]) ? $k[$key][$i]:false;
}
/* 使用自動產生的索引建立陣列 */
else
$ret[$v][] = isset($k[$i]) ? $k[$i]: false;
}
/* 取得下一個偏移量 */
$i++;
}
return
$ret;
}

/* 範例 */
$r = array(1,2,4,10);

$a1 = array('one','two','four','ten');
$a2 = array('un','deux','quatre','dix');
$a3 = array('uno','dos','quatro','diez');

print_r(array_combine_array($r,array('english' => $a1),array('french' => $a2),array('spanish' => $a3))); /* 關聯索引,關聯子陣列索引 */
print_r(array_combine_array($r,$a1,array('french' => $a2),array('spanish' => $a3))); /* 輸出錯誤 */
print_r(array_combine_array($r,$a1,$a2,$a3)); /* 關聯索引,自動產生的子陣列索引 */
print_r(array_combine_array(array(),array('english' => $a1),array('french' => $a2),array('spanish' => $a3))); /* 自動產生的索引,關聯子陣列索引 */
?>
0
Dan LaManna
13 年前
我需要一個函數來截斷多餘的值,而且只能執行到鍵的數量,而不會像 `array_combine` 那樣拋出警告。

<?php
function safeArrayCombine($keys, $values) {
$combinedArray = array();

for (
$i=0, $keyCount = count($keys); $i < $keyCount; $i++) {
$combinedArray[$keys[$i]] = $values[$i];
}

return
$combinedArray;
}
?>
-1
douglasrich9215 at gmail dot com
6 年前
當我嘗試在控制器中處理非關聯陣列形式時,我突然有了靈感。這個簡短的一行程式碼幾乎可以編輯任何類型的非關聯陣列。例如,這個程式碼只會傳回新使用者輸入的值的陣列。

`$data` 值是註冊表單的 `json_decoded()` 值。
這裡使用了 `str_replace`,您絕對可以做一些其他的事情,例如 preg 匹配等等。

$readyToProcessForUser = array_combine(str_replace("new_user_", "", array_keys($data)), $data);

您也可以對值執行相同的操作。

$readyToProcessForUser = array_combine(array_keys($data), str_replace("-", "", $data));

或者兩者都做!
如果您不想透過相同的回呼函式來走訪整個陣列和鍵,這非常有用。

$readyToProcessForUser = array_combine(array_walk('trim', array_keys($data)), array_walk('custom_callback', array_values($data)));
To Top