13

ok, assuming I have 5 arrays, all just indexed arrays, and I would like to combine them, this is the best way I can figure, is there a better way to handle this?

function mymap_arrays(){ $args=func_get_args(); $key=array_shift($args); return array_combine($key,$args); } $keys=array('u1','u2','u3'); $names=array('Bob','Fred','Joe'); $emails=array('[email protected]','[email protected]','[email protected]'); $ids=array(1,2,3); $u_keys=array_fill(0,count($names),array('name','email','id')); $users=array_combine($keys,array_map('mymap_arrays',$u_keys,$names,$emails,$ids)); 

this returns:

Array ( [u1] => Array ( [name] => Bob [email] => [email protected] [id] => 1 ) [u2] => Array ( [name] => Fred [email] => [email protected] [id] => 2 ) [u3] => Array ( [name] => Joe [email] => [email protected] [id] => 3 ) ) 

EDIT: After lots of benchmarking I wend with a version of Glass Robots answer to handle a variable number of arrays, it's slower than his obviously, but faster than my original:

function test_my_new(){ $args=func_get_args(); $keys=array_shift($args); $vkeys=array_shift($args); $results=array(); foreach($args as $key=>$array){ $vkey=array_shift($vkeys); foreach($array as $akey=>$val){ $result[$keys[$akey]][$vkey]=$val; } } return $result; } $keys=array('u1','u2','u3'); $names=array('Bob','Fred','Joe'); $emails=array('[email protected]','[email protected]','[email protected]'); $ids=array(1,2,3); $vkeys=array('name','email','id'); test_my_new($keys,$vkeys,$names,$emails,$ids); 
2
  • It works ;) What should be better? Commented Jul 1, 2011 at 22:30
  • I'm always surprised at how little I know about php;) when I'm doing a lot of processing with a specific function I always worried that I'm "taking the long way around"... I know this isn't that long, but it's going to be used a lot in the system I'm developing:) Commented Jul 1, 2011 at 22:32

4 Answers 4

21

Personally for readability I would do it this way:

$keys = array('u1','u2','u3'); $names = array('Bob','Fred','Joe'); $emails = array('[email protected]','[email protected]','[email protected]'); $ids = array(1,2,3); $result = array(); foreach ($keys as $id => $key) { $result[$key] = array( 'name' => $names[$id], 'email' => $emails[$id], 'id' => $ids[$id], ); } 
Sign up to request clarification or add additional context in comments.

1 Comment

more readable and faster:) Now I just need to set it up to accept a variable number of arrays, and an array that defines that value keys for each array withing the result array:)
7

I did not check the efficiency, but in my solution I am using only standard functions (they should be optimized) without custom mapping and looping outside them:

// assigning the data from your question $keys = array('u1','u2','u3'); $names = array('Bob','Fred','Joe'); $emails = array('[email protected]','[email protected]','[email protected]'); $ids = array(1,2,3); // creating resulting array $result = array_merge_recursive( array_combine($keys, $names), array_combine($keys, $emails), array_combine($keys, $ids) ); 

Did you try this solution?

Comments

4

Here's basically a one-liner for a set number of elements:

$combined = array_combine($keys, array_map(function ($id, $name, $email) { return compact('id', 'name', 'email'); }, $ids, $names, $emails)); 

And here a version for PHP 5.2- without anonymous functions:

$combined = array_combine($keys, array_map(create_function('$id, $name, $email', 'return compact("id", "name", "email");' ), $ids, $names, $emails)); 

For a variable number of elements, it'll look like this:

function combineValues($keys, $values) { $vKeys = array_keys($values); return array_combine($keys, array_map( function ($values) use ($vKeys) { return array_combine($vKeys, $values); }, call_user_func_array('array_map', array_merge( array(function () { return func_get_args(); }), $values)))); } $combined = combineValues($keys, array('name' => $names, 'email' => $emails, 'id' => $ids)); 

I have to admit that looks pretty cryptic, so here's an expanded version:

function combineValues($keys, $values) { $valueKeys = array_keys($values); $combinedValues = call_user_func_array('array_map', array_merge(array(function () { return func_get_args(); }), $values)); $combinedValues = array_map(function ($values) use ($valueKeys) { return array_combine($valueKeys, $values); }, $combinedValues); return array_combine($keys, $combinedValues); } 

For PHP 5.2- this may look like this:

function combineValues($keys, $values) { $result = call_user_func_array('array_map', array_merge( array(create_function('', 'return func_get_args();')), $values)); array_walk($result, create_function('&$val, $i, $keys', '$val = array_combine($keys, $val);'), array_keys($values)); return array_combine($keys, $result); } 

Comments

0

Simply try this for multiples array combine (if you have length of arrays)

$array_id = array ('1', '2', '3'); $array1 = array ('arr1_value1', 'arr1_value2', 'arr1_value3'); $array2 = array ('arr2_value1', 'arr2_value2', 'arr2_value3'); $array3 = array ('arr3_value1', 'arr3_value2', 'arr3_value3'); $lenght = count($array_id); $i = 0; while ($i < $lenght) { $result[] = array( $array_id[$i] , $array1[$i] , $array2[$i] , $array3[$i] ); $i++; } echo '<pre>'; print_r($result); 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.