tags:

views:

64

answers:

2

Using a proprietary framework, I am frequently finding myself in the situation where I get a resultset from the database in the following format:

array(5) {
  [0] => array(1) {
    ["id"] => int(241)
  }
  [1] => array(1) {
    ["id"] => int(2)
  }
  [2] => array(1) {
    ["id"] => int(81)
  }
  [3] => array(1) {
    ["id"] => int(560)
  }
  [4] => array(1) {
    ["id"] => int(10)
  }
}

I'd much rather have a single array of ids, such as:

array(5) {
  [0] => int(241)
  [1] => int(2)
  [2] => int(81)
  [3] => int(560)
  [4] => int(10)
}

To get there, I frequently find myself writing:

$justIds = array();
foreach( $allIds as $id ) {
  $justIds[] = $id["id"];
}

Is there a more efficient way to do this?

+6  A: 
$out = array_map('array_shift', $in);

e.g.

$in = array(
  array("id" => 241),
  array ("id" => 2),
  array ("id" => 81),
  array ("id" => 560),
  array ("id" => 10)
);
$out = array_map('array_shift', $in);
var_dump($out);

prints

array(5) {
  [0]=>
  int(241)
  [1]=>
  int(2)
  [2]=>
  int(81)
  [3]=>
  int(560)
  [4]=>
  int(10)
}
VolkerK
It would probably be more efficient to use `reset` instead because `array_shift` changes the passed array. EDIT: just tested, using 'reset' gives a 6% improvement with your example on my windows debug build.
Artefacto
What would a solution using reset look like?
Rob Drimmie
Just replace `array_shift` by `reset`.
VolkerK
+6  A: 

With PHP 5.3 you can do

$justIds = array_map(
    function($cur) {
        return $cur['id'];
    },
    $allIds
);

With PHP < 5.3 you'd have define a regular function and then pass the name as string to array_map().

johannes
Actually VolkerK's version with array_shift might be nicer than my custom callback
johannes
On the other hand this version works even if the input array contains arrays with more than one element regardless of the order. +1
VolkerK
I marked VolkerK's as best answer because it addresses the specific example but there are enough times where I will need to handle multi-element sub-arrays that I will be able to add both techniques to my arsenal. Thanks to you both!
Rob Drimmie