Rachel
Rachel

Reputation: 103397

How to get array of values from an associative arrays?

How can I get an array of values from an associative array ?

Associate array Example:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )
    [1] => Array
        (
            [0] => 4
            [1] => 5
            [2] => 6
        )
    [2] => Array
        (
            [0] => 7
        )
)

Desired Output

Array
(1,2,3,4,5,6,7)

Upvotes: 6

Views: 2748

Answers (4)

goat
goat

Reputation: 31813

$flattened = call_user_func_array('array_merge', $array);

Upvotes: 1

intuited
intuited

Reputation: 24034

under php 5.3 this should be really nice and convenient, because the array elements used by array_reduce are interpreted as mixed rather than fixed as integer

so

print_r(array_reduce($test, 'array_merge'))

I haven't tested it -- no copy of 5.3 -- at least in theory that should do it. Under <5.3 you'll get errors.

Note that this only merges the top level of array, unlike the solution using array_walk_recursive.

Upvotes: 1

Pascal MARTIN
Pascal MARTIN

Reputation: 400932

Not sure it'll suit you, as it's PHP >= 5.3 only, but here's a possible solution, using array_walk_recursive and a closure (see Anonymous functions) :

$array = array(
    array(1, 2, 3), 
    array(4, 5, 6), 
    array(7), 
);

$result = array();
array_walk_recursive($array, function ($value, $key) use (& $result) {
    $result[] = $value;
});
var_dump($result);

And the result :

array
  0 => int 1
  1 => int 2
  2 => int 3
  3 => int 4
  4 => int 5
  5 => int 6
  6 => int 7

Basicaly, the closure is the only way I got this to work : it's used to import the $result variable, by reference, into the anonymous function.



And, just to post it, the only I got this working for PHP 5.2 (i.e. not using a closure) is with this :

$result = array();
array_walk_recursive($array, 'my_func', & $result);
var_dump($result);

function my_func($value, $key, & $result) {
    $result[] = $value;
}

Which works too -- but raises a warning :

Deprecated: Call-time pass-by-reference has been deprecated

Unfortunatly, I didn't find a way of getting this to work without passing $result by reference at call-time :-(
(Maybe someone else has an idea, about how to do that ?)

Upvotes: 8

Pekka
Pekka

Reputation: 449385

Do an array_merge() on each separate member.

$test = Array
(
    "0" => Array
        (
            0 => 1,
            1 => 2,
            2 => 3,
        ),
    "1" => Array
        (
            0 => 4,
            1 => 5,
            2 => 6,
        ),
    "2" => Array
        (
            0 => 7,
        )
);

print_r(array_merge($test[0],$test[1],$test[2]));
// Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 ) 

Upvotes: 1

Related Questions