PHP에서 다차원 배열을 단순한 것으로 "평평하게"만드는 방법은 무엇입니까?
PHPPHP에서 다차원 배열을 단순한 것으로 "평평하게"만드는 방법은 무엇입니까?
초보자 용 질문일지도 모르지만 나는 이미 문서화 작업을 오래하고 있으며 어떤 해결책도 찾을 수 없습니다. 각 차원에 implode를 사용할 수 있다고 생각한 다음 str_split과 함께 다시 새로운 간단한 배열을 만들었습니다. 그러나 조인 패턴이 값에 없기 때문에 str_split을 수행 한 후에 원래 값이 깨질 수도 있습니다.
배열 ($ array1, $ array2)을 다차원 배열 내부에 결합하는 것과 같은 것이 있습니까?
해결법
-
==============================
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.
$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.이것은 사용하기 쉬운 SUPER 한 줄입니다.
이것은 사용하기 쉬운 SUPER 한 줄입니다.
$result = array(); array_walk_recursive($original_array,function($v) use (&$result){ $result[] = $v; });
익명의 함수 / 클로저 안에서는 매우 이해하기 쉽습니다. $ v는 $ original_array의 값입니다.
-
==============================
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.
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.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.비 재귀 솔루션 (하지만 주문 파기) :
비 재귀 솔루션 (하지만 주문 파기) :
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.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.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.고차 함수 사용하기 (참고 : 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.다중 배열에서 문자열 키를 덮어 쓰는 버그를 수정 한 혼돈에 의해 제출 된 앞의 예제 함수를 기반으로 한 새로운 접근법 :
다중 배열에서 문자열 키를 덮어 쓰는 버그를 수정 한 혼돈에 의해 제출 된 앞의 예제 함수를 기반으로 한 새로운 접근법 :
# 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.
/*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.당신은 이것을 시도 할 수있다 :
당신은 이것을 시도 할 수있다 :
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.배열 키를 잃어 버리면 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.비표준 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.간단한 접근법 ... 재귀를 통해보십시오.
간단한 접근법 ... 재귀를 통해보십시오.
<?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.특정 키의 값에만 관심이 있다면이 방법이 유용 할 수 있습니다.
특정 키의 값에만 관심이 있다면이 방법이 유용 할 수 있습니다.
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.이 모든 일은 저를 위해서 ... 그래서 직접 실행해야했습니다. 잘 작동합니다.
이 모든 일은 저를 위해서 ... 그래서 직접 실행해야했습니다. 잘 작동합니다.
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.주어진 다차원 배열을 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; }
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
'PHP' 카테고리의 다른 글
MySQL datetime에서 PHP로 다른 형식으로 변환 (0) | 2018.09.06 |
---|---|
open_basedir 제한이 적용됩니다. 파일 (/)이 (가) 허용 된 경로 내에 있지 않습니다. (0) | 2018.09.06 |
Javascript로 PHP 배열을 변환 (0) | 2018.09.06 |
PHP로 혜성을 사용하고 있습니까? (0) | 2018.09.05 |
PHP를 사용하여 XML 파일을 동적으로 생성하는 방법은 무엇입니까? (0) | 2018.09.05 |