복붙노트

PHP에서 다차원 배열을 단순한 것으로 "평평하게"만드는 방법은 무엇입니까?

PHP

PHP에서 다차원 배열을 단순한 것으로 "평평하게"만드는 방법은 무엇입니까?

초보자 용 질문일지도 모르지만 나는 이미 문서화 작업을 오래하고 있으며 어떤 해결책도 찾을 수 없습니다. 각 차원에 implode를 사용할 수 있다고 생각한 다음 str_split과 함께 다시 새로운 간단한 배열을 만들었습니다. 그러나 조인 패턴이 값에 없기 때문에 str_split을 수행 한 후에 원래 값이 깨질 수도 있습니다.

배열 ($ array1, $ array2)을 다차원 배열 내부에 결합하는 것과 같은 것이 있습니까?

해결법

  1. ==============================

    1.array_walk_recursive 사용

    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)로 테스트 (빌드 : Mar 16 2018 12:32:06)

  2. ==============================

    2.

    $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);
    
  3. ==============================

    3.이것은 사용하기 쉬운 SUPER 한 줄입니다.

    이것은 사용하기 쉬운 SUPER 한 줄입니다.

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

    익명의 함수 / 클로저 안에서는 매우 이해하기 쉽습니다. $ v는 $ original_array의 값입니다.

  4. ==============================

    4.

    // $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

  5. ==============================

    5.

    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;
    }
    
  6. ==============================

    6.PHP의 사용자 주석 (단순화 된)과 여기에서 또 다른 방법 :

    PHP의 사용자 주석 (단순화 된)과 여기에서 또 다른 방법 :

    function array_flatten_recursive($array) { 
       if (!$array) return false;
       $flat = array();
       $RII = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
       foreach ($RII as $value) $flat[] = $value;
       return $flat;
    }
    

    이 방법의 가장 큰 이점은 병합하는 동안 재귀 깊이를 추적해야한다는 것입니다. 그러면 다음과 같이 출력됩니다.

    $array = array( 
        'A' => array('B' => array( 1, 2, 3)), 
        'C' => array(4, 5) 
    ); 
    print_r(array_flatten_recursive($array)); 
    
    #Returns: 
    Array ( 
        [0] => 1 
        [1] => 2 
        [2] => 3 
        [3] => 4 
        [4] => 5 
    )
    
  7. ==============================

    7.비 재귀 솔루션 (하지만 주문 파기) :

    비 재귀 솔루션 (하지만 주문 파기) :

    function flatten($ar) {
        $toflat = array($ar);
        $res = array();
    
        while (($r = array_shift($toflat)) !== NULL) {
            foreach ($r as $v) {
                if (is_array($v)) {
                    $toflat[] = $v;
                } else {
                    $res[] = $v;
                }
            }
        }
    
        return $res;
    }
    
  8. ==============================

    8.PHP> = 5.3에서 Luc M의 답변 (첫 번째 답변)을 기반으로 다음과 같이 클로저를 사용할 수 있습니다

    PHP> = 5.3에서 Luc M의 답변 (첫 번째 답변)을 기반으로 다음과 같이 클로저를 사용할 수 있습니다

    array_walk_recursive($aNonFlat, function(&$v, $k, &$t){$t->aFlat[] = $v;}, $objTmp);
    

    create_function ()을 사용할 때와 같이 함수의 코드를 따옴표로 묶을 필요가 없기 때문에 이것을 좋아합니다.

  9. ==============================

    9.PHP 7을 사용하면 생성기와 생성자 위임 (yield from)을 사용하여 배열을 병합 할 수 있습니다.

    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

  10. ==============================

    10.고차 함수 사용하기 (참고 : PHP 5.3에 등장한 인라인 익명 함수를 사용하고 있습니다) :

    고차 함수 사용하기 (참고 : PHP 5.3에 등장한 인라인 익명 함수를 사용하고 있습니다) :

    function array_flatten($array) {
        return array_reduce(
            $array,
            function($prev, $element) {
                if (!is_array($element))
                    $prev[] = $element;
                else
                    $prev = array_merge($prev, array_flatten($element));
                return $prev;
            },
            array()
        );
    }
    
  11. ==============================

    11.다중 배열에서 문자열 키를 덮어 쓰는 버그를 수정 한 혼돈에 의해 제출 된 앞의 예제 함수를 기반으로 한 새로운 접근법 :

    다중 배열에서 문자열 키를 덮어 쓰는 버그를 수정 한 혼돈에 의해 제출 된 앞의 예제 함수를 기반으로 한 새로운 접근법 :

    # 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
    
    function flatten_array($array, $preserve_keys = 2, &$out = array(), &$last_subarray_found) 
    {
            foreach($array as $key => $child)
            {
                if(is_array($child))
                {
                    $last_subarray_found = $key;
                    $out = flatten_array($child, $preserve_keys, $out, $last_subarray_found);
                }
                elseif($preserve_keys + is_string($key) > 1)
                {
                    if ($last_subarray_found)
                    {
                        $sfinal_key_value = $last_subarray_found . "_" . $key;
                    }
                    else
                    {
                        $sfinal_key_value = $key;
                    }
                    $out[$sfinal_key_value] = $child;
                }
                else
                {
                    $out[] = $child;
                }
            }
    
            return $out;
    }
    
    Example:
    $newarraytest = array();
    $last_subarray_found = "";
    $this->flatten_array($array, 2, $newarraytest, $last_subarray_found);
    
  12. ==============================

    12.

    /*consider $mArray as multidimensional array and $sArray as single dimensional array
    this code will ignore the parent array
    */
    
    function flatten_array2($mArray) {
        $sArray = array();
    
        foreach ($mArray as $row) {
            if ( !(is_array($row)) ) {
                if($sArray[] = $row){
                }
            } else {
                $sArray = array_merge($sArray,flatten_array2($row));
            }
        }
        return $sArray;
    }
    
  13. ==============================

    13.당신은 이것을 시도 할 수있다 :

    당신은 이것을 시도 할 수있다 :

    function flat_an_array($a)
    {
        foreach($a as $i)
        {
            if(is_array($i)) 
            {
                if($na) $na = array_merge($na,flat_an_array($i));
                else $na = flat_an_array($i);
            }
            else $na[] = $i;
        }
        return $na;
    }
    
  14. ==============================

    14.배열 키를 잃어 버리면 array_values ​​()를 사용하는 콜백으로 재귀 클로저를 사용하여 다차원 배열을 평평하게 만들고이 콜백이 array_walk ()에 대한 매개 변수인지 확인합니다.

    배열 키를 잃어 버리면 array_values ​​()를 사용하는 콜백으로 재귀 클로저를 사용하여 다차원 배열을 평평하게 만들고이 콜백이 array_walk ()에 대한 매개 변수인지 확인합니다.

    <?php  
    
    $array = [1,2,3,[5,6,7]];
    $nu_array = null;
    $callback = function ( $item ) use(&$callback, &$nu_array) {
        if (!is_array($item)) {
        $nu_array[] = $item;
        }
        else
        if ( is_array( $item ) ) {
         foreach( array_values($item) as $v) {
             if ( !(is_array($v))) {
                 $nu_array[] = $v;
             }
             else
             { 
                 $callback( $v );
             continue;
             }    
         }
        }
    };
    
    array_walk($array, $callback);
    print_r($nu_array);
    

    위의 예제의 단점은 array_walk_recursive ()를 단순 콜백과 함께 사용하는 다음 솔루션보다 훨씬 더 많은 코드를 작성해야한다는 것입니다.

    <?php  
    
    $array = [1,2,3,[5,6,7]];
    
    $nu_array = [];
    array_walk_recursive($array, function ( $item ) use(&$nu_array )
                         {
                             $nu_array[] = $item;
                         }
    );
    print_r($nu_array);
    

    실시간 코드보기

    이 예제는 다차원 배열에서 값을 추출하는 방법에 대한 세부 정보를 숨겨 이전 예제보다 바람직합니다. 확실히 반복은 발생하지만, 재귀 또는 제어 구조가 수반되는지 여부에 관계없이 array.c를 살펴볼 때만 알 수 있습니다. 함수형 프로그래밍은 결과를 얻는 세부 사항보다는 입력 및 출력에 초점을 맞추기 때문에, 투영기가 어떻게 발생하는지, 즉 고용주가 이러한 질문을 제기 할 때까지는 신경 쓰지 않아도됩니다.

  15. ==============================

    15.비표준 PHP 라이브러리 (NSPL)의 flatten 함수를 사용할 수 있습니다. 배열 및 반복 가능한 데이터 구조와 함께 작동합니다.

    비표준 PHP 라이브러리 (NSPL)의 flatten 함수를 사용할 수 있습니다. 배열 및 반복 가능한 데이터 구조와 함께 작동합니다.

    assert([1, 2, 3, 4, 5, 6, 7, 8, 9] === flatten([[1, [2, [3]]], [[[4, 5, 6]]], 7, 8, [9]]));
    
  16. ==============================

    16.간단한 접근법 ... 재귀를 통해보십시오.

    간단한 접근법 ... 재귀를 통해보십시오.

    <?php
    
    function flatten_array($simple){
    static $outputs=array();
    foreach ( $simple as $value)
    {
    if(is_array($value)){
        flatten_array($value);
    }
    else{
        $outputs[]=$value;
    }
    
    }
    return $outputs;
    }
    
    $eg=['s'=>['p','n'=>['t']]];
    $out=flatten_array($eg);
    print_r($out);
    
    ?>
    
  17. ==============================

    17.특정 키의 값에만 관심이 있다면이 방법이 유용 할 수 있습니다.

    특정 키의 값에만 관심이 있다면이 방법이 유용 할 수 있습니다.

    function valuelist($array, $array_column) {
        $return = array();
        foreach($array AS $row){
            $return[]=$row[$array_column];
        };
        return $return;
    };
    

    예:

    주어진 $ get_role_action =

    array(3) {
      [0]=>
      array(2) {
        ["ACTION_CD"]=>
        string(12) "ADD_DOCUMENT"
        ["ACTION_REASON"]=>
        NULL
      }
      [1]=>
      array(2) {
        ["ACTION_CD"]=>
        string(13) "LINK_DOCUMENT"
        ["ACTION_REASON"]=>
        NULL
      }
      [2]=>
      array(2) {
        ["ACTION_CD"]=>
        string(15) "UNLINK_DOCUMENT"
        ["ACTION_REASON"]=>
        NULL
      }
    }
    

    $ 변수보다 [ 'role_action_list'] = valuelist ($ get_role_action, 'ACTION_CD'); 결과는 다음과 같습니다.

    $variables["role_action_list"]=>
      array(3) {
        [0]=>
        string(12) "ADD_DOCUMENT"
        [1]=>
        string(13) "LINK_DOCUMENT"
        [2]=>
        string(15) "UNLINK_DOCUMENT"
      }
    

    거기에서 다음과 같은 값 조회를 수행 할 수 있습니다.

    if( in_array('ADD_DOCUMENT', $variables['role_action_list']) ){
        //do something
    };
    
  18. ==============================

    18.이 모든 일은 저를 위해서 ... 그래서 직접 실행해야했습니다. 잘 작동합니다.

    이 모든 일은 저를 위해서 ... 그래서 직접 실행해야했습니다. 잘 작동합니다.

    function arrayFlat($arr){
    $out = '';
        foreach($arr as $key => $value){
    
            if(!is_array($value)){
                $out .= $value.',';
            }else{
                $out .= $key.',';
                $out .= arrayFlat($value);
            }
    
        }
        return trim($out,',');
    }
    
    
    $result = explode(',',arrayFlat($yourArray));
    echo '<pre>';
    print_r($result);
    echo '</pre>';
    
  19. ==============================

    19.주어진 다차원 배열을 1 차원으로 변환하려면 배열이있는 모든 값의 설정을 해제하고이를 첫 번째 차원에 저장하면됩니다. 예를 들면 다음과 같습니다.

    주어진 다차원 배열을 1 차원으로 변환하려면 배열이있는 모든 값의 설정을 해제하고이를 첫 번째 차원에 저장하면됩니다. 예를 들면 다음과 같습니다.

    function _flatten_array($arr) {
      while ($arr) {
        list($key, $value) = each($arr); 
        is_array($value) ? $arr = $value : $out[$key] = $value;
        unset($arr[$key]);
      }
      return (array)$out;
    }
    
  20. from https://stackoverflow.com/questions/526556/how-to-flatten-a-multi-dimensional-array-to-simple-one-in-php by cc-by-sa and MIT license