[php] PHP에서 다차원 배열을 단순 배열로 “평탄화”하는 방법은 무엇입니까?

아마도 초보 질문 일 수 있지만 이미 문서화를 더 오래 진행하고 있으며 해결책을 찾을 수 없습니다. 나는 각 차원에 대해 내파를 사용할 수 있다고 생각한 다음 그 문자열을 다시 결합하여 str_split새로운 간단한 배열을 만들 수 있습니다. 그러나 조인 패턴이 값에도 없는지 결코 알 수 없으므로 str_split원래 값 을 수행 한 후에 는 깨질 수 있습니다.

combine($array1, $array2)다차원 배열 내부의 배열 과 같은 것이 있습니까?



답변

사용하다 array_walk_recursive

<?php

$aNonFlat = array(
    1,
    2,
    array(
        3,
        4,
        5,
        array(
            6,
            7
        ),
        8,
        9,
    ),
    10,
    11
);

$objTmp = (object) array('aFlat' => array());

array_walk_recursive($aNonFlat, create_function('&$v, $k, &$t', '$t->aFlat[] = $v;'), $objTmp);

var_dump($objTmp->aFlat);

/*
array(11) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
  [5]=>
  int(6)
  [6]=>
  int(7)
  [7]=>
  int(8)
  [8]=>
  int(9)
  [9]=>
  int(10)
  [10]=>
  int(11)
}
*/

?>

PHP 5.5.9-1ubuntu4.24 (cli)로 테스트 됨 (빌드 : 2018 년 3 월 16 일 12:32:06)


답변

$array  = your array

$result = call_user_func_array('array_merge', $array);

echo "<pre>";
print_r($result);

참조 : http://php.net/manual/en/function.call-user-func-array.php

다음은 또 다른 솔루션입니다 (다차원 배열로 작동).

function array_flatten($array) {

   $return = array();
   foreach ($array as $key => $value) {
       if (is_array($value)){ $return = array_merge($return, array_flatten($value));}
       else {$return[$key] = $value;}
   }
   return $return;

}

$array  = Your array

$result = array_flatten($array);

echo "<pre>";
print_r($result);


답변

이것은 한 줄이며 사용하기 매우 쉽습니다.

$result = array();
array_walk_recursive($original_array,function($v) use (&$result){ $result[] = $v; });

익명의 기능 / 폐쇄 내에서 이해하기 매우 쉽습니다. $v귀하의 $original_array.


답변

// $array = your multidimensional array

$flat_array = array();

foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $k=>$v){

$flat_array[$k] = $v;

}

또한 문서화 됨 :
http://www.phpro.org/examples/Flatten-Array.html


답변

특별히 한 수준 이상으로 가지 않는 배열이있는 경우 (일반적인 사용 사례) array_merge및 표시 연산자를 사용하면됩니다.

<?php

$notFlat = [[1,2],[3,4]];
$flat = array_merge(...$notFlat);
var_dump($flat);

산출:

array(4) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
}

splat 연산자는 배열의 배열을에 대한 인수로 배열 목록으로 효과적으로 변경합니다 array_merge.


답변

PHP 7에서는 생성기 및 생성기 위임 ( yield from)을 사용하여 배열을 평면화 할 수 있습니다.

function array_flatten_iterator (array $array) {
    foreach ($array as $value) {
        if (is_array($value)) {
            yield from array_flatten_iterator($value);
        } else {
            yield $value;
        }
    }
}

function array_flatten (array $array) {
    return iterator_to_array(array_flatten_iterator($array), false);
}

예:

$array = [
    1,
    2,
    [
        3,
        4,
        5,
        [
            6,
            7
        ],
        8,
        9,
    ],
    10,
    11,
];

var_dump(array_flatten($array));

http://3v4l.org/RU30W


답변

function flatten_array($array, $preserve_keys = 0, &$out = array()) {
    # Flatten a multidimensional array to one dimension, optionally preserving keys.
    #
    # $array - the array to flatten
    # $preserve_keys - 0 (default) to not preserve keys, 1 to preserve string keys only, 2 to preserve all keys
    # $out - internal use argument for recursion
    foreach($array as $key => $child)
        if(is_array($child))
            $out = flatten_array($child, $preserve_keys, $out);
        elseif($preserve_keys + is_string($key) > 1)
            $out[$key] = $child;
        else
            $out[] = $child;
    return $out;
}