2

I have one big array structured like this

$array = array(

   [0] => array(
      'labels' => array('a', 'b', 'c', [...]),
      'values' => array('val A', 'val B', 'val C', [...])
   ),

   [1] => array(
      'labels' => array('d', 'e', 'f', [...]),
      'values' => array('val D', 'val E', 'val F', [...])
   ),

   [2] => array(
      'labels' => array([...]),
      'values' => array([...])
   ),

   [...],

   [n]

)

I want to create a new array for every key, like so:

$labels = array('a', 'b', 'c', 'd', 'e', 'f', [...])
$values = array('val A', 'val B', 'val C', 'val D', 'val E', 'val F', [...])

I would normally use array_merge, but I don't know how many arrays I will have.

Is there any way of doing it without looping multiple times ?

Thank you

C. Ovidiu
  • 1,104
  • 2
  • 18
  • 38

2 Answers2

2

Something like:

$labels = call_user_func_array('array_merge', array_column($array, 'labels'));
$values = call_user_func_array('array_merge', array_column($array, 'values'));

perhaps?

Mark Baker
  • 209,507
  • 32
  • 346
  • 385
  • 2
    If you use PHP5.6, you can reduce this code to : `array_merge(...array_column($array, 'labels'))` More elegant imho ;) – JesusTheHun Jan 25 '16 at 13:07
  • Unfortunately I have 5.3 on the client's hosting, so I cannot use your method. It's a shame because I like one liners. – C. Ovidiu Jan 25 '16 at 13:16
1

If you want to do some manipulations before building the final array, consider something like this :

$labels = array();
$values = array();

$r = array_map(function($subArray) use(&$labels, &$values) {

    // do some stuff here, maybe

    $labels = array_merge($labels, $subArray['labels']);
    $values = array_merge($values, $subArray['values']);

}, $array);
JesusTheHun
  • 1,217
  • 1
  • 10
  • 19