Слияние PHP-массивов с неизвестным количеством параметров

У меня есть массив PHP, который выглядит так:

$array['my_data']['value'] = 'some value';
$array['my_own_data']['value'] = 'another value';
$array['different_data']['value'] = 'another value';

Мне нужно использовать array_merge в PHP или что-то подобное. Проблема в том, что количество ключей первого уровня неизвестно. Это может быть 150 предметов, я не знаю.

Это не будет работать для меня из-за неизвестного количества ключей:

array_merge($array['my_data'], $array['my_own_data'], $array['different_data']);

Нужна ли мне петля или есть что-то модное?

6 ответов

Решение

Это может сделать, если это то, что вы хотите:

$array = array_map('current', $array);

или возможно

$array = array_map(function ($a) { return $a['value']; }, $array);

Это должно дать вам

array('some value', 'another value', 'another value')

Проблема в том, что количество ключей первого уровня неизвестно. Это может быть 150 предметов, я не знаю.

Эту проблему легко решить.

Если вы хотите узнать количество ключей первого уровня:

$numberOfKeysOfTheFirstLevel = count($array);

Там вы знаете номер сейчас. Если вам действительно нужны их имена, вы также можете сделать это:

$keyNamesOfTheFirstLevel = array_keys($array);

Итак, вы продолжили в своем вопросе:

Это не будет работать для меня из-за неизвестного количества ключей: array_merge($array['my_data'], $array['my_own_data'], $array['different_data']);

Хорошей новостью является то, что вам не нужно знать количество ключей для выполнения array_merge операция:

call_user_func_array('array_merge', $array);

Что касается того, что вы написали в своем вопросе, это должно ответить на него. Однако результат может оказаться не таким, как вы ожидали. Смотрите другие ответы, пожалуйста, и, пожалуйста, спросите.

Пожалуйста, попробуйте это:

$new_array = array();
foreach($array as $item) {
  $new_array[] = $item['value'];
};
// 1. your array should have different keys, otherwise it will have no effect
$array['my_data']['value1'] = 'some value';
$array['my_own_data']['value2'] = 'another value';
$array['different_data']['value3'] = 'another value';

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

вернусь

array(
  'value1' => 'some value', 
  'value2' => 'another value', 
  'value3' => 'another value', 
)

В противном случае, вы хотели что-то подобное?

array(
  'value' => array('some value', 'another value', 'another value')
)

Тогда вы могли бы сделать

$array['my_data']['value'] = 'some value';
$array['my_own_data']['value'] = 'another value';
$array['different_data']['value'] = 'another value';

$result = array();
// PHP <= 5.2
array_walk($array, create_function('&$item, $key, &$dest', '
    foreach ((array) $item as $subKey => $value) {
        if (!isset($dest[$subKey])) { $dest[$subKey] = array(); }
        $dest[$subKey][] = $value;
    }
'), & $result);
var_export($result);

Если я понимаю, что вы хотите, вы могли бы использовать array_map,

Изменить:

$a = array();
$a['x']['value'] = 1;
$a['y']['value'] = 3;
$a['z']['value'] = 3;

в:

array(3) {
 ["x"]=>
 int(1)
 ["y"]=>
 int(2)
 ["z"]=>
 int(3)
}

Вы можете определить функцию:

function f($x) { return $x['value'];}

и использовать array_map:

$b = array_map(f, $a);
array_map(function($a){
    return $a['value'];
},$array);

для php5.2 и старше:

function stuff($a){
    return $a['value'];
}
array_map('stuff',$array);
Другие вопросы по тегам