2016-10-21 3 views
2

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

ответ

0

Краткое решение с использованием 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 
) 
+0

Что такое $ v, что такое $ k, в контексте это имеет смысл - но почему нужно жертвовать читабельностью, чтобы сохранить несколько символов? –

+0

Вы ищете «персонажей» или для рабочих решений? – RomanPerekhrest

+0

Я просто прошу об обосновании @RomanPerekhrest - кажется ненужным все, просто уменьшает читаемость кода. –

0
$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; 
    } 
} 
+0

_Just примечанием: _ Джек, вы можете удалить ответ, а затем отредактировать его, а затем восстановить ответ. Вместо того, чтобы удалять ответ, а затем создавать еще один – RiggsFolly

+0

Да, мой плохой @RiggsFolly –

+0

Неплохо, просто подумал, что я дам вам знать – RiggsFolly

0

Вы можете использовать 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 в массиве. –

+0

Да, вы правы. Я пропустил 1 и 5. –

Смежные вопросы