数组 函数
在线手册:中文  英文

array_combine

(PHP 5)

array_combine 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值

说明

array array_combine ( array $keys , array $values )

返回一个 array,用来自 keys 数组的值作为键名,来自 values 数组的值作为相应的值。

参数

keys

Array of keys to be used. Illegal values for key will be converted to string.

values

Array of values to be used

返回值

返回合并的 array,如果两个数组的单元数不同则返回 FALSE

错误/异常

Throws E_WARNING if the number of elements in keys and values does not match.

更新日志

版本 说明
5.4.0 Previous versions issued E_WARNING and returned FALSE for empty arrays.

范例

Example #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
)

参见


数组 函数
在线手册:中文  英文

用户评论:

loureirorg at gmail dot com (2013-03-14 10:48:00)

If two keys are the same, the second one prevails. 

Example:
<?php
print_r
(array_combine(Array('a','a','b'), Array(1,2,3)));
?>
Returns:
Array
(
    [a] => 2
    [b] => 3
)

But if you need to keep all values, you can use the function below:

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

print_r(array_combine_(Array('a','a','b'), Array(1,2,3)));
?>
Returns:
Array
(
    [a] => Array
        (
            [0] => 1
            [1] => 2
        )

    [b] => 3
)

aaron at aaronholmes dot net (2013-01-22 16:54:02)

You can create an array hashset from a flat array, storing both keys and values, with array_combine(). This works with duplicate values in the array too.

<?php
$flat_array 
= array(
        
'one',
        
'two',
        
'three',
        
'three',
        
'four',
        
'one'
);

$set array_combine($flat_array$flat_array);

var_dump($set);
?>

This outputs the following:

array(4) {
    ["one"]=>
        string(3) "one"
    ["two"]=>
        string(3) "two"
    ["three"]=>
        string(5) "three"
    ["four"]=>
        string(4) "four"
}

g.REMOVETHIS.vincendon AT vithemis.com (2012-07-18 09:41:12)

I was looking for a function that could combine an array to multiple one, for my MySQL GROUP_CONCAT() query, so I made this function.

<?php
    
function array_combine_array(array $keys)
    {
        
$arrays func_get_args();
        
$keys array_shift($arrays);
        
        
/* Checking if arrays are on the same model (array('INDEX'=> array()) or 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(); }
        
        
/* Checking the model of arrays, array('INDEX' => array()) or Array() */
        
$assocArray is_array(array_shift(array_map('current',$arrays)));
        
        
/* If empty $Keys is given, we fill an empty array */
        
if (empty($keys)) $keys array_keys(array_fill(0,max(($assocArray) ? array_map('count',array_map('current',$arrays)) : array_map('count',$arrays)),'foo'));

        
/* Init */
        
$ret=array();$i=0;
        
/* Cycling on each keys values, making an offset for each */
        
foreach($keys as $v)
        {
            
/* Cycling on arrays */
            
foreach ($arrays as $k)
            {
                if (
$assocArray)
                {
                    
/* Getting the index of the element */
                    
$key key($k);
                    
/* If the offset exists, we place it */
                    
$ret[$v][$key] = isset($k[$key][$i]) ? $k[$key][$i]:false;
                }
                
/* Making the array with auto-made index */
                
else
                    
$ret[$v][] = isset($k[$i]) ? $k[$i]: false;
            }
            
/* Getting the next offset */
            
$i++;
        }
        return 
$ret;
    }

    
/* Examples */
    
$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))); /* Associative index, associative subarray indexes */
     
print_r(array_combine_array($r,$a1,array('french' => $a2),array('spanish' => $a3))); /* Ouputs Error */
     
print_r(array_combine_array($r,$a1,$a2,$a3)); /* Associative index, auto-made subarray indexes */
     
print_r(array_combine_array(array(),array('english' => $a1),array('french' => $a2),array('spanish' => $a3))); /* Auto-made index, associative subarray indexes */
?>

andymeredith at NOSPAM dot gmail dot com (2012-06-29 15:17:51)

I was looking for a function to take a linear array, $array, and combine the elements into an associative array. I used the following function to wrap the behavior of array_combine() to combine odd and even elements of the original array:

<?php
function combineLinearArray$arrayToSmush$evenItemIsKey true ) {
    if ( ( 
count($arrayToSmush) % ) !== ) {
        throw new 
Exception"This array cannot be combined because it has an odd number of values" );
    }

    
$evens $odds = array();
    
// Extract even values
    
for ($i 0$c count($arrayToSmush); $i $c$i += 2) {
        
$evens[] = $arrayToSmush[$i];
    }
    
// Extract odd values
    
for ($i 1$c count($arrayToSmush); $i $c$i += 2) {
        
$odds[] = $arrayToSmush[$i];
    }

    
// Combine them and return
    
return ( $evenItemIsKey ) ? array_combine($evens$odds) : array_combine($odds$evens) ;
}

?>

Here is an example of usage:

<?php
$array 
= array( 'one'1'two'2'three'3'four');
print_rcombineLinearArray($array) );
/*
Prints:
Array
(
    [one] => 1
    [two] => 2
    [three] => 3
    [four] => 4
)
*/
?>

dejiakala at gmail dot com (2011-10-27 03:32:50)

I needed to read CSV files into associative arrays with column headers as keys. Then I ran into a problem when you have empty columns at the end of a row because array_combine returns false if both arrays don't have the same number of elements. This function based on quecoder at gmail's combine_arr() below allowed me to pad either array or not when parsing my CSVs to arrays.
$a is the array of header columns and $b is an array of the current row retrieved with fgetcsv()

<?php

function array_combine_special($a$b$pad TRUE) {
    
$acount count($a);
    
$bcount count($b);
    
// more elements in $a than $b but we don't want to pad either
    
if (!$pad) {
        
$size = ($acount $bcount) ? $bcount $acount;
        
$a array_slice($a0$size);
        
$b array_slice($b0$size);
    } else {
        
// more headers than row fields
        
if ($acount $bcount) {
            
$more $acount $bcount;
            
// how many fields are we missing at the end of the second array?
            // Add empty strings to ensure arrays $a and $b have same number of elements
            
$more $acount $bcount;
            for(
$i 0$i $more$i++) {
                
$b[] = "";
            }
        
// more fields than headers
        
} else if ($acount $bcount) {
            
$more $bcount $acount;
            
// fewer elements in the first array, add extra keys        
            
for($i 0$i $more$i++) {
                
$key 'extra_field_0' $i;
                
$a[] = $key;
            }
            
        }
    }
    
    return 
array_combine($a$b);
}
?>

Dan LaManna (2011-09-17 20:12:05)

I needed a function that truncated extra values, and only went as far as keys without throwing a warning as array_combine does.

<?php
function safeArrayCombine($keys$values) {
    
$combinedArray = array();
        
    for (
$i=0$keyCount count($keys); $i $keyCount$i++) {
         
$combinedArray[$keys[$i]] = $values[$i];
    }
        
    return 
$combinedArray;
}
?>

zequez at gmail dot com (2011-03-27 15:51:35)

If two keys are the same, the second one prevails.
Example:
<?php
print_r
(array_combine(Array('a','a','b'), Array(1,2,3)));
?>
Returns:
Array
(
    [a] => 2
    [b] => 3
)

claude dot pache at gmail dot com (2010-05-12 10:04:51)

array_combine() has a strange bug/misfeature (as of PHP 5.3.2): There is no logical reason for <? array_combine(array(), array()) ?> throwing a warning and returning FALSE, instead of returning <? array() ?> (see http://bugs.php.net/bug.php?id=34857). Here is a quick workaround:
<?php
function array_real_combine($a$b)
{
    return 
$a===array() && $b===array() ? array() : array_combine($a$b);
}
?>

bradentkeith at dot dontspam dot gmail dot com (2010-04-01 12:20:01)

I needed a function that would take keys from one unequal array and combine them with the values of another. Real life application:
Select 4 product types.
Each product has a serial.
There are 4 sets of products.

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

Input:
Array
(
    [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
)

Array
(
    [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
            [Projector] => serials to projector 2
            [Speakers] => serials to speakers 2
            [Splitter] => serials to splitter 2
        )

)

xavier at api-meal dot eu (2009-09-23 03:37:58)

<?php
/**
 * Return alternatives defined by values of each parameters.
 *
 * Exemple :
 *
 * array_alternatives(array('foo','bar'), array('baz', 'qux'));
 * array(
 *     array('foo', 'baz'),
 *     array('bar', 'baz'),
 *     array('foo', 'qux'),
 *     array('bar', 'qux'),
 * );
 * 
 * array_alternatives(array('a'), array('simple-minded'), array('solution'));
 * array(
 *     array('a', 'simple-minded', 'solution')
 * );
 * 
 * array_alternatives(array('a'), array('red', 'blue'), array('car'));
 * array(
 *     array('a', 'red',  'car'),
 *     array('a', 'blue', 'car'),
 * );
 *  
 * @param array $first_element
 * @param array $second_element
 * @return array
 * @author Xavier Barbosa
 */
function array_alternatives(array $first_element, array $second_element)
{
    
$lists func_get_args();
    
$total_lists func_num_args();
    
    for(
$i=0$i<$total_lists$i++)
    {
        
$list =& $lists[$i];
        if (
is_array($list) === FALSE)
            throw new 
Exception("Parameter $i is not an array.");
        if (
count($list) === 0)
            throw new 
Exception("Parameter $i has no element.");
        unset(
$list);
    }
    
    
// Initialize our alternatives
    
$alternatives = array();
    foreach(
$lists[0] as &$value)
    {
        
array_push($alternatives, array($value));
        unset(
$value);
    }
    unset(
$lists[0]);
    
    
// Process alternatives
    
for($i=1$i<$total_lists$i++)
    {
        
$list =& $lists[$i];
        
        
$new_alternatives = array();
        foreach(
$list as &$value)
        {
            foreach(
$alternatives as $_)
            {
                
array_push($_$value);
                
array_push($new_alternatives$_);
            }
        }
        
        
// Rotate references, it's cheaper than copy array like `$alternatives = $new_alternatives;`
        
$alternatives =& $new_alternatives;
        unset(
$new_alternatives$list$lists[$i]);
    }
    
    return 
$alternatives;
}
?>

quecoder at gmail (2008-08-26 00:00:56)

<?php
// If they are not of same size, here is solution:

$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($a0$size);
    
$b array_slice($b0$size);
    return 
array_combine($a$b);
}
$combined combine_arr($abbreviations$states);
print_r($combined); 

//  Output
//  Array ( [AL] => Alabama [AK] => Alaska [AZ] => Arizona 
//  [AR] => Arkansas )
?>

J.D.D. (2008-08-09 13:31:29)

This may be obvious, but I don't see anything about it on the manual page, so a friendly warning...  The array you are using as keys must have all unique values.  If not, array elements get dropped.  

<?php
$arr_notUnique 
= array('one' 'one' 'two');
$arr_b = array('red' 'green' 'blue');

$arr_combo array_combine($arr_notUnique$arr_b);
?>

Results:  Array ( [one] => green [two] => blue )

NOT:  Array ( [one] => red [one] => green [two] => blue )

Zoran (2008-04-02 04:57:59)

Also, Khalys function only works if keys of both arrays are the same because array_combine ignores keys. An easy way to ignore them is by taking array_values(). Floats can be casted to strings to avoid overwriting. 

So, the PHP4 function could look something like this:
<?php
function array_combine($arr1$arr2) {
    
$out = array();
    
    
$arr1 array_values($arr1);
    
$arr2 array_values($arr2);
    
    foreach(
$arr1 as $key1 => $value1) {
        
$out[(string)$value1] = $arr2[$key1];
    }
    
    return 
$out;
}
?>

Mike Jean (2008-03-18 21:59:04)

Khaly's PHP4 code below does not work correctly in all cases. Consider when your array consists of floats:

<?php

$okay 
= array(0102030);
$not_okay = array(00.511.5);

$foo array_combine($okay$okay);
$bar array_combine($not_okay$not_okay);

/* 

Results:

$foo = {
  [0]=> int(0)
  [10]=> int(10)
  [20]=> int(20)
  [30]=> int(30)
}

$bar = {
  [0]=> float(0.5)
  [1]=> float(1.5)
}

*/

?>

What can you do? In my case, I was just zipping up some select-box options, so I converted everything in my floats to strings.

Khaly (2007-10-04 02:11:48)

This is the function for PHP4 :

<?php

function array_combine($arr1,$arr2) {
   
$out = array();
   foreach(
$arr1 as $key1 => $value1)    {
    
$out[$value1] = $arr2[$key1];
   }
   return 
$out
}

?>

neoyahuu at yahoo dot com (2007-03-19 20:36:24)

Some tips for merging same values in an array

<?php
$array1 
= array(1,2,3,4,5,6,7,8,9,10,11,12);
$array2 = array(1,2,3,13);

$merged array_merge($array1,$array2);

// output normal array_merge
echo '<pre>After array_merge :
'
;
print_r($merged);
echo 
'</pre>';

// do double flip for merging values in an array
$merged array_flip($merged);
$merged array_flip($merged);

// Output after
echo '<pre>After Double Flip : 
'
;
print_r($merged);
echo 
'</pre>';
?>

Output ::

After array_merge :
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 10
    [10] => 11
    [11] => 12
    [12] => 1
    [13] => 2
    [14] => 3
    [15] => 13
)

After Double Flip : 
Array
(
    [12] => 1
    [13] => 2
    [14] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 10
    [10] => 11
    [11] => 12
    [15] => 13
)

ifeghali at interveritas dot net (2005-02-26 10:53:02)

Use that code to group an array by its first element.

<?

function groupbyfirst($array)
{
    foreach ($array as $row)
    {
        $firstkey = array_keys($row);
        $firstkey = $firstkey[0];
        $key = $row[$firstkey];
        unset($row[$firstkey]);
        $newarray[$key][] = $row;
    }
    return $newarray;
}

?>

Example:

<?

$array = 
Array(
    0 => Array('color' => 'red','name' => 'apple', 'quantity' => '3'),
    1 => Array('color' => 'green','name' => 'pear', 'quantity' => '2'),
    2 => Array('color' => 'yellow','name' => 'corn', 'quantity' => '3'),
    3 => Array('color' => 'blue','name' => 'grape', 'quantity' => '4'),
    4 => Array('color' => 'yellow','name' => 'banana', 'quantity' => '13'),
);

$output = groupbyfirst($array);
print_r($output);

?>

will return:

Array
(
 [red] => Array ( [0] => Array ( [name] => apple [quantity] => 3 ) )
 [green] => Array ( [0] => Array ( [name] => pear [quantity] => 2 ) )
 [yellow] => Array ( [0] => Array ( [name] => corn [quantity] => 3 ), [1] => Array ( [name] => banana [quantity] => 13 ) )
 [blue] => Array ( [0] => Array ( [name] => grape [quantity] => 4 ))
)

Or you can use mysql recordset:

<?
while ($row=mysql_fetch_array($result,MYSQL_ASSOC))
{
    $firstkey = array_keys($row);
    $firstkey = $firstkey[0];
    $key = $row[$firstkey];
    unset($row[$firstkey]);
    $newarray[$key][] = $row;
}
?>

aidan at php dot net (2004-05-20 19:15:17)

This functionality is now implemented in the PEAR package PHP_Compat.
More information about using this function without upgrading your version of PHP can be found on the below link:
http://pear.php.net/package/PHP_Compat

易百教程