array_combine

(PHP 5)

array_combineErzeugt ein Array, indem es ein Array für die Schlüssel und ein anderes für die Werte verwendet

Beschreibung

array array_combine ( array $keys , array $values )

Erzeugt ein Array, in dem die Werte des keys-Arrays als Schlüssel und die Werte aus dem values-Array als die zugehörigen Werte verwendet werden.

Parameter-Liste

keys

Array mit den zu verwendenden Schlüsseln. Für Schlüssel ungültige Werte werden in einen String umgewandelt.

values

Array mit den zu verwendenden Werten

Rückgabewerte

Gibt das kombinierte Array oder FALSE zurück, wenn die Anzahl von Elementen nicht in beiden Arrays identisch ist.

Fehler/Exceptions

Wirft einen Fehler der Stufe E_WARNING, wenn die Anzahl der Elemente in keys und values nicht übereinstimmt.

Changelog

Version Beschreibung
5.4.0 Vorherige Versionen warfen ein E_WARNING Fehler und gaben FALSE zurück, wenn zwei leere Arrays übergeben wurden.

Beispiele

Beispiel #1 Ein einfaches array_combine()-Beispiel

<?php
$a 
= array('gruen''rot''gelb');
$b = array('avokado''apfel''banane');
$c array_combine($a$b);

print_r($c);
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Array
(
    [gruen]  => avokado
    [rot]    => apfel
    [gelb]   => banane
)

Siehe auch

add a note add a note

User Contributed Notes 15 notes

up
14
loureirorg at gmail dot com
1 year ago
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($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)));
?>
Returns:
Array
(
    [a] => Array
        (
            [0] => 1
            [1] => 2
        )

    [b] => 3
)
up
5
quecoder at gmail
5 years ago
<?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($a, 0, $size);
   
$b = array_slice($b, 0, $size);
    return
array_combine($a, $b);
}
$combined = combine_arr($abbreviations, $states);
print_r($combined);

//  Output
//  Array ( [AL] => Alabama [AK] => Alaska [AZ] => Arizona
//  [AR] => Arkansas )
?>
up
3
zequez at gmail dot com
3 years ago
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
)
up
2
neoyahuu at yahoo dot com
7 years ago
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
)
up
2
claude dot pache at gmail dot com
3 years ago
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);
}
?>
up
3
Khaly
6 years ago
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
}

?>
up
1
g.REMOVETHIS.vincendon AT vithemis.com
1 year ago
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 */
?>
up
1
dejiakala at gmail dot com
2 years ago
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($a, 0, $size);
       
$b = array_slice($b, 0, $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);
}
?>
up
0
aaron at aaronholmes dot net
1 year ago
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"
}
up
0
Dan LaManna
2 years ago
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;
}
?>
up
-1
Anonymous
8 months ago
Here is the Better solutions for array combine :

http://www.myfric.com/blog/item/php-array-combine-key-and-value
up
0
Mike Jean
6 years ago
Khaly's PHP4 code below does not work correctly in all cases. Consider when your array consists of floats:

<?php

$okay
= array(0, 10, 20, 30);
$not_okay = array(0, 0.5, 1, 1.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.
up
-1
bradentkeith at dot dontspam dot gmail dot com
4 years ago
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
        )

)
up
-1
xavier at api-meal dot eu
4 years ago
<?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;
}
?>
up
-2
J.D.D.
5 years ago
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 )
To Top