php — как объединить ключ с подразделом в одном массиве

#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.