PHP массив объединить из неизвестного количества параметров - PullRequest
1 голос
/ 19 июля 2011

У меня есть массив 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 ]

4 голосов
/ 19 июля 2011

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

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

или, возможно,

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

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

array('some value', 'another value', 'another value')
2 голосов
/ 19 июля 2011

Проблема в том, что количество ключей первого уровня неизвестно.Это может быть 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);

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

1 голос
/ 19 июля 2011
// 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);
1 голос
/ 19 июля 2011

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

$new_array = array();
foreach($array as $item) {
  $new_array[] = $item['value'];
};
0 голосов
/ 19 июля 2011

Если я понимаю, что вы хотите, вы можете использовать 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);
0 голосов
/ 19 июля 2011
array_map(function($a){
    return $a['value'];
},$array);

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

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