#php #arrays
#php #массивы
Вопрос:
У меня есть такой массив :
array(
(int) 1 => array(
(int) 3 => 'value',
(int) 12 => 'value'
),
(int) 5 => array(
(int) 8 => 'value',
(int) 10 => 'value',
(int) 15 => 'value'
)
)
Какой наилучший способ объединить ключи с подразделами без учета значений, чтобы получить что-то подобное?
array(
(int) 0 => (int) 1,
(int) 1 => (int) 3,
(int) 2 => (int) 12,
(int) 3 => (int) 5,
(int) 4 => (int) 8,
(int) 5 => (int) 10,
(int) 6 => (int) 15
)
Ответ №1:
Краткое решение с использованием функций array_keys
и array_merge
:
$keys = [];
foreach ($arr as $k => $v) { // $arr is your initial array
$keys[] = $k;
if (is_array($v)) $keys = array_merge($keys, array_keys($v));
}
print_r($keys);
Вывод:
Array
(
[0] => 1
[1] => 3
[2] => 12
[3] => 5
[4] => 8
[5] => 10
[6] => 15
)
Комментарии:
1. Что такое $ v, что такое $ k, в контексте это имеет смысл — но зачем жертвовать удобочитаемостью ради сохранения нескольких символов?
2. вы ищете «символы» или рабочие решения?
3. Я просто прошу обоснования @RomanPerekhrest — все кажется ненужным, просто снижает читаемость кода.
4. кажется ненужным — это все — вам все кажется ненужным? кажется, что это всего лишь ваше мнение
5. Ну, я просто считаю, что предоставление читаемого кода лучше, чем предоставление менее читаемого кода просто для сохранения символов, особенно если код изначально не требует пояснений.
Ответ №2:
$newArray = [];
$arrays = array(
(int) 1 => array(
(int) 3 => 'value',
(int) 12 => 'value'
),
(int) 5 => array(
(int) 8 => 'value',
(int) 10 => 'value',
(int) 15 => 'value'
)
)
foreach($arrays as $key => $array) {
$newArray[] = $key;
foreach($array as $key => $item) {
$newArray[] = $key;
}
}
Комментарии:
1. Просто примечание: Джек, ты можешь удалить ответ, затем отредактировать его, затем восстановить ответ. Вместо того, чтобы удалять ответ и затем создавать другой
2. Да, мой плохой @RiggsFolly
3. Неплохо, просто подумал, что дам вам знать
Ответ №3:
Вы могли бы использовать array_walk_recursive() для php 5 и выше.
//$oldArray = your array
$newArray = [];
function build_array($item,$key){
global $newArray;
$newArray[] = $key;
}
array_walk_recursive($oldArray,'build_array');
$newArray = array_merge(array_keys($oldArray),$newArray); //needed for the first keys (1,5) as Jory Geerts correctly pointed out.
Комментарии:
1. Использование глобалов может сделать код очень хрупким, поэтому мы должны избегать этого, если это возможно. В этом случае вы могли бы использовать замыкание, например, так:
array_walk_recursive($oldArray, function ($item, $key) use ($newArray) { $newArray[] = $key;});
Однако, согласно руководству, «Любой ключ, содержащий массив, не будет передан функции». таким образом, этот подход не сработал бы, поскольку Carilboue также хочет, чтобы в массиве были 1 и 5.