Слияние 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);