Преобразование массива php массивов в один массив

У меня есть массив, значения которого представляют собой все массивы определенного формата, которые выглядят следующим образом:

Array
(
 [0] => Array
 (
 [username] => John
 ) 
 [1] => Array
 (
 [username] => Joe
 )
 [2] => Array
 (
 [username] => Jake
 )
)

и я хотел бы иметь это:

Array
(
 [0] => John 
 [1] => Joe
 [2] => Jake
)

Я могу сделать это вручную с помощью цикла, но есть ли лучший способ? Если нет, возможно ли это сделать для массива объектов, которые имеют общий атрибут?

9 ответов

Так как PHP 5.5.0 есть встроенная функция array_column, которая делает именно это.


зачем усложнять вещи?

foreach($array as $k=>$v) {
 $new[$k] = $v['username'];
}


Если вы используете PHP 5.3, вы можете использовать array_walk_recursive и закрытие (закрытие может быть заменено нормальной функцией, если ваша версия PHP и lt; 5.3):

function arrayFlatten(array $array) {
 $flatten = array();
 array_walk_recursive($array, function($value) use(&$flatten) {
 $flatten[] = $value;
 });
 return $flatten;
}
$nested = array(
 array('username' => 'John'),
 array('username' => 'Joe'),
 array('username' => 'Jake'),
);
$flattened = arrayFlatten($nested);
var_dump($flattened)
array
 0 => string 'John' (length=4)
 1 => string 'Joe' (length=3)
 2 => string 'Jake' (length=4)


$new_array = array_column($last_array, 'username');


Если вам не нужны клавиши:

$new_array = array();
foreach($array as $v) {
 $new_array[] = $v['username']
}


Для тех, кто использует composer:

  • если <= php5.5 array_column можно использовать
  • if > php5.5 доступные полиполки, такие как https://github.com/symfony/polyfill/tree/master/src/Php55. Как только вы composer install symfony/polyfill-php55, вы можете просто вызвать array_column, как если бы ваш php5.4 или ниже имел его.


$new = array_map(create_function('$auser', 'return $auser["username"];'), $array);

Если вы используете объекты, вы можете просто изменить return $auser["username"]; на return $auser->get_username();


Попробуйте этот код:

foreach ($arr as $key => $val)
{
 sort($val );
 $new = array_merge($val, $new);
}
print_r ($new);


Попробуйте следующее:

$list=array();
foreach($array as $v) {
 array_push($list, $v['username']);
}

licensed under cc by-sa 3.0 with attribution.