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 个备注

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] => Array
(
[0] => 1
[1] => 2
)

[b] => 3
)
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);
}
?>
welcome at el hyphen mustafa
8 年前
补充 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;
}

?>
quecoder at gmail
15 年前
<?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 )
?>
zequez at gmail dot com
13 年前
如果两个键相同,则第二个键优先。
示例
<?php
print_r
(array_combine(Array('a','a','b'), Array(1,2,3)));
?>
返回
数组
(
[a] => 2
[b] => 3
)
dejiakala at gmail dot com
12 年前
我需要将 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);
}
?>
Dan LaManna
12 年前
我需要一个函数来截断额外的值,并且只处理键,而不会像 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;
}
?>
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))); /* 自动生成的索引,关联子数组索引 */
?>
info at callismart dot com dot ng
15 天前
从 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;
}
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] => Array
(
[0] => username1
[1] => user2
)

[GB] => Array
(
[0] => newuser
)
)
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] => Projector
[2] => Speakers
[3] => Splitter
)
, Array
(
[0] => serial to smart board1
[1] => serial to projector 1
[2] => serial to speakers 1
[3] => serials to splitter 1
[4] => serials to smart board 2
[5] => serials to projector 2
[6] => serials to speakers 2
[7] => serials to splitter 2
)

数组
(
[0] => Array
(
[SMART Board] => serial to smart board1
[Projector] => serial to projector 1
[Speakers] => serial to speakers 1
[Splitter] => serials to splitter 1
)

[1] => Array
(
[SMART Board] => serials to smart board 2
[投影仪] => serial 到投影仪 2
[扬声器] => serial 到扬声器 2
[分配器] => serial 到分配器 2
)

)
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);
}

我知道,我是个新手,但也许其他人最终会需要它。我在任何地方都找不到其他解决方案。
douglasrich9215 at gmail dot com
6 年前
当我尝试处理控制器中的非关联数组表单时,我突然领悟到这一点。这个简短的一行代码几乎可以编辑任何类型的非关联数组。例如,这个代码只返回新用户输入的值的数组。

$data 值是注册表单的 json_decoded() 值。
这里使用了 `str_replace`,您当然可以做很多事情,比如正则表达式匹配和其他事情。

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

您也可以对值做同样的事情。

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

或者两者都做!
如果您不想遍历整个数组和键来使用相同的回调,请使用 `array_walk`。

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