다차원 어레이를 단일 어레이로 변환
이유 없이 다차원 배열이 있습니다.
/* This is how my array is currently */
Array
(
[0] => Array
(
[0] => Array
(
[plan] => basic
)
[1] => Array
(
[plan] => small
)
[2] => Array
(
[plan] => novice
)
[3] => Array
(
[plan] => professional
)
[4] => Array
(
[plan] => master
)
[5] => Array
(
[plan] => promo
)
[6] => Array
(
[plan] => newplan
)
)
)
이 어레이를 이 형식으로 변환합니다.
/*Now, I want to simply it down to this*/
Array (
[0] => basic
[1] => small
[2] => novice
[3] => professional
[4] => master
[5] => promo
[6] => newplan
)
어떻게 하는지 아세요?
이 한 줄이면 됩니다.
$array = array_column($array, 'plan');
첫 번째 인수는 array |두 번째 인수는 array 키입니다.
상세한 것에 대하여는, 다음의 공식 메뉴얼을 참조해 주세요.https://www.php.net/manual/en/function.array-column.php
이 어레이가 용장 네스트 되어 있는 경우와 그렇지 않은 경우가 있으며, 어느 정도의 깊이가 있는지 알 수 없는 경우, 이 경우 어레이가 평평해집니다.
function array_flatten($array) {
if (!is_array($array)) {
return FALSE;
}
$result = array();
foreach ($array as $key => $value) {
if (is_array($value)) {
$result = array_merge($result, array_flatten($value));
}
else {
$result[$key] = $value;
}
}
return $result;
}
다음과 같이 순수 데이터인 다차원 배열이 발견되면 array_merge()에 대한 단일 호출을 사용하여 리플렉션을 통해 작업을 수행할 수 있습니다.
$arrayMult = [ ['a','b'] , ['c', 'd'] ];
$arraySingle = call_user_func_array('array_merge', $arrayMult);
// $arraySingle is now = ['a','b', 'c', 'd'];
자신의 첫 번째 요소에 할당하기만 하면 됩니다.
$array = $array[0];
이 경우 다음과 같이 처리됩니다.
$array = array_map('current', $array[0]);
기본적으로 같은 질문입니다.여기서 몇 가지 답을 보세요.PHP 어레이는 미지의 파라미터 수에서 병합됩니다.
$singleArray = array();
foreach ($multiDimensionalArray as $key => $value){
$singleArray[$key] = $value['plan'];
}
multiDimensionalArray에서 어레이를 작성하는 가장 좋은 방법입니다.
감사해요.
네스트된 어레이의 레벨이 여러 개일 경우 어떤 답변도 도움이 되지 않았습니다.솔루션은 @AlienWebguy가 이미 했던 것과 거의 동일하지만 약간의 차이가 있습니다.
function nestedToSingle(array $array)
{
$singleDimArray = [];
foreach ($array as $item) {
if (is_array($item)) {
$singleDimArray = array_merge($singleDimArray, nestedToSingle($item));
} else {
$singleDimArray[] = $item;
}
}
return $singleDimArray;
}
테스트 예시
$array = [
'first',
'second',
[
'third',
'fourth',
],
'fifth',
[
'sixth',
[
'seventh',
'eighth',
[
'ninth',
[
[
'tenth'
]
]
],
'eleventh'
]
],
'twelfth'
];
$array = nestedToSingle($array);
print_r($array);
//output
array:12 [
0 => "first"
1 => "second"
2 => "third"
3 => "fourth"
4 => "fifth"
5 => "sixth"
6 => "seventh"
7 => "eighth"
8 => "ninth"
9 => "tenth"
10 => "eleventh"
11 => "twelfth"
]
문제 배열:
array:2 [▼
0 => array:3 [▼
0 => array:4 [▼
"id" => 8
"name" => "Veggie Burger"
"image" => ""
"Category_type" => "product"
]
1 => array:4 [▼
"id" => 9
"name" => "Veggie Pitta"
"image" => ""
"Category_type" => "product"
]
2 => array:4 [▼
"id" => 10
"name" => "Veggie Wrap"
"image" => ""
"Category_type" => "product"
]
]
1 => array:2 [▼
0 => array:4 [▼
"id" => 18
"name" => "Cans 330ml"
"image" => ""
"Category_type" => "product"
]
1 => array:4 [▼
"id" => 19
"name" => "Bottles 1.5 Ltr"
"image" => ""
"Category_type" => "product"
]
]
]
솔루션 어레이:
array:5 [▼
0 => array:4 [▼
"id" => 8
"name" => "Veggie Burger"
"image" => ""
"Category_type" => "product"
]
1 => array:4 [▼
"id" => 9
"name" => "Veggie Pitta"
"image" => ""
"Category_type" => "product"
]
2 => array:4 [▼
"id" => 10
"name" => "Veggie Wrap"
"image" => ""
"Category_type" => "product"
]
3 => array:4 [▼
"id" => 18
"name" => "Cans 330ml"
"image" => ""
"Category_type" => "product"
]
4 => array:4 [▼
"id" => 19
"name" => "Bottles 1.5 Ltr"
"image" => ""
"Category_type" => "product"
]
]
를 작성하여 .$subcate
다차원 배열입니다.
$singleArrayForCategory = array_reduce($subcate, 'array_merge', array());
루프만으로 할 수 있습니다.
$singleArray = array();
foreach ($multiDimensionalArray as $key => $value){
$singleArray[$key] = $value['plan'];
}
표본 배열에는 세 가지 수준이 있습니다. 번째 은 '''만 때문에[0]
에의 액세스를 하드 코드로 해, 기능이나 콜을 추가하지 않게 할 수 있습니다.
(코드 데모)
array_walk_filename()은 편리하고 다용도이지만, 이 작업에서는 과잉으로 인해 가독성 면에서 다소 복잡할 수 있습니다.
array_walk_recursive($array, function($leafvalue)use(&$flat){$flat[] = $leafvalue;}); var_export($flat);
이것이 내 코드라면 array_column()을 사용합니다.이는 직접적이고 실행 중인 액션에 대해 문자 그대로 말하기 때문입니다.
var_export(array_column($array[0], 'plan'));
물론 언어 구조가 함수 호출보다 더 효율적으로 수행되기 때문에 몇 가지 'foreach' 루프는 매우 효율적으로 수행됩니다.
foreach ($array[0] as $plans) { foreach ($plans as $value) { $flat[] = $value; } } var_export($flat);
마지막으로 펑키한 대체 수단으로서(제가 좋아하지 않는 사람을 위해 코드를 쓰지 않는 한 실제로 사용하는 것은 상상할 수 없습니다) splat 연산자와 array_merge_recursive() 콜을 제공합니다( ).
...
).var_export(array_merge_recursive(...$array[0])['plan']);
그럼에도 불구하고array_column
내부 구조에 관계없이 어레이를 평평하게 할 필요가 있는 경우에는 이 어레이 라이브러리를 사용하여 쉽게 실현할 수 있습니다.
$flattened = Arr::flatten($array);
원하는 어레이를 생성할 수 있습니다.
최근 Alien Webguy의 array_flaten 함수를 사용하고 있습니다만, 그 원인을 알기 어려운 문제가 발생했습니다.
array_merge는 문제를 일으킵니다.또한 문제가 발생한 것도 이번이 처음이 아닙니다.
하나의 내부 배열에 다른 내부 배열과 동일한 배열 키가 있는 경우 이후 값이 병합된 배열의 이전 배열에 덮어씁니다.
array_merge를 사용하지 않는 array_flaten의 다른 버전을 다음에 나타냅니다.
function array_flatten($array) {
if (!is_array($array)) {
return FALSE;
}
$result = array();
foreach ($array as $key => $value) {
if (is_array($value)) {
$arrayList=array_flatten($value);
foreach ($arrayList as $listItem) {
$result[] = $listItem;
}
}
else {
$result[$key] = $value;
}
}
return $result;
}
이 간단한 코드를 사용할 수 있습니다.
$array = array_column($array, 'value', 'key');
대부분의 투표된 답변에 오류가 있습니다.여기 올바른 버전이 있습니다.
function array_flatten($array) {
if (!is_array($array)) {
return FALSE;
}
$result = array();
foreach ($array as $key => $value) {
if (is_array($value)) {
$result = array_merge($result, array_flatten($value));
}
else {
$result[] = $value;
}
}
return $result;
}
차액이 걸려 있다$result[] = $value;
원래 답은$result[$key] = $value;
사이클 내의 어레이를 조정한 후 $key 인덱스가 올바르지 않습니다.
이 패턴에 따라
$input = array(10, 20, array(30, 40), array('key1' => '50', 'key2'=>array(60), 70));
함수를 호출합니다.
echo "<pre>";print_r(flatten_array($input, $output=null));
함수 선언:
function flatten_array($input, $output=null) {
if($input == null) return null;
if($output == null) $output = array();
foreach($input as $value) {
if(is_array($value)) {
$output = flatten_array($value, $output);
} else {
array_push($output, $value);
}
}
return $output;
}
나는 받아들여진 답변에 대한 보충문을 썼다.나처럼 접두사 버전이 필요한 경우 도움이 될 수 있습니다.
Array
(
[root] => Array
(
[url] => http://localhost/misc/markia
)
)
Array
(
[root.url] => http://localhost/misc/markia
)
<?php
function flattenOptions($array, $old = '') {
if (!is_array($array)) {
return FALSE;
}
$result = array();
foreach ($array as $key => $value) {
if (is_array($value)) {
$result = array_merge($result, flattenOptions($value, $key));
}
else {
$result[$old . '.' . $key] = $value;
}
}
return $result;
}
키 입력 텍스트를 사용한 검색 값보다 다차원 배열을 단일 차원 배열로 평평하게 만들어야 하는 동일한 요구 사항을 접하게 되었습니다.여기 내 코드가 있다.
$data = '{
"json_data": [{
"downtime": true,
"pfix": {
"max": 100,
"threshold": 880
},
"ints": {
"int": [{
"rle": "pri",
"device": "laptop",
"int": "Ether3",
"ip": "127.0.0.3"
}],
"eth": {
"lan": 57
}
}
},
{
"downtime": false,
"lsi": "987654",
"pfix": {
"min": 10000,
"threshold": 890
},
"mana": {
"mode": "NONE"
},
"ints": {
"int": [{
"rle": "sre",
"device": "desk",
"int": "Ten",
"ip": "1.1.1.1",
"UF": true
}],
"ethernet": {
"lan": 2
}
}
}
]
}
';
$data = json_decode($data,true);
$stack = &$data;
$separator = '.';
$toc = array();
while ($stack) {
list($key, $value) = each($stack);
unset($stack[$key]);
if (is_array($value)) {
$build = array($key => ''); # numbering without a title.
foreach ($value as $subKey => $node)
$build[$key . $separator . $subKey] = $node;
$stack = $build + $stack;
continue;
}
if(!is_numeric($key)){
$toc[$key] = $value;
}
}
echo '<pre/>';
print_r($toc);
출력:
Array
(
[json_data] =>
[json_data.0] =>
[json_data.0.downtime] => 1
[json_data.0.pfix] =>
[json_data.0.pfix.max] => 100
[json_data.0.pfix.threshold] => 880
[json_data.0.ints] =>
[json_data.0.ints.int] =>
[json_data.0.ints.int.0] =>
[json_data.0.ints.int.0.rle] => pri
[json_data.0.ints.int.0.device] => laptop
[json_data.0.ints.int.0.int] => Ether3
[json_data.0.ints.int.0.ip] => 127.0.0.3
[json_data.0.ints.eth] =>
[json_data.0.ints.eth.lan] => 57
[json_data.1] =>
[json_data.1.downtime] =>
[json_data.1.lsi] => 987654
[json_data.1.pfix] =>
[json_data.1.pfix.min] => 10000
[json_data.1.pfix.threshold] => 890
[json_data.1.mana] =>
[json_data.1.mana.mode] => NONE
[json_data.1.ints] =>
[json_data.1.ints.int] =>
[json_data.1.ints.int.0] =>
[json_data.1.ints.int.0.rle] => sre
[json_data.1.ints.int.0.device] => desk
[json_data.1.ints.int.0.int] => Ten
[json_data.1.ints.int.0.ip] => 1.1.1.1
[json_data.1.ints.int.0.UF] => 1
[json_data.1.ints.ethernet] =>
[json_data.1.ints.ethernet.lan] => 2
)
이것은 나의 공헌이다.
function arrayUnica($array, $prefix = "")
{
if (!is_array($array)) {
return false;
}
$new_array = [];
foreach ($array as $key => $value) {
if (is_array($value)) {
$key = is_int($key) ? $prefix . $key . "-" : $key . "_";
$new_array = array_merge($new_array, arrayUnica($value, $key));
} else {
$new_array[$prefix . $key] = $value;
}
}
return $new_array;
}
저는 OOP 스타일로 해봤어요.
$res=[1=>[2,3,7,8,19],3=>[4,12],2=>[5,9],5=>6,7=>[10,13],10=>[11,18],8=>[14,20],12=>15,6=>[16,17]];
class MultiToSingle{
public $result=[];
public function __construct($array){
if(!is_array($array)){
echo "Give a array";
}
foreach($array as $key => $value){
if(is_array($value)){
for($i=0;$i<count($value);$i++){
$this->result[]=$value[$i];
}
}else{
$this->result[]=$value;
}
}
}
}
$obj= new MultiToSingle($res);
$array=$obj->result;
print_r($array);
1개의 라인 코드를 사용하여 다차원 어레이에서1개의 어레이로!!코드를 즐기세요.
$array=[1=>[2,5=>[4,2],[7,8=>[3,6]],5],4];
$arr=[];
array_walk_recursive($array, function($k){global $arr; $arr[]=$k;});
print_r($arr);
...코드를 즐기세요.
이 방법을 사용해 보세요.
$newArray = array();
foreach($operator_call_logs as $array) {
foreach($array as $k=>$v) {
$newArray[$k] = $v;
}
}
이를 php 파일로 저장하여 single_array() 함수를 Import하여 사용합니다.
<?php
$GLOBALS['single_array']=[];
function array_conveter($array_list){
if(is_array($array_list)){
foreach($array_list as $array_ele){
if(is_array($array_ele)){
array_conveter($array_ele);
}else{
array_push($GLOBALS['single_array'],$array_ele);
}
}
}else{
array_push($GLOBALS['single_array'],$array_list);
}
}
function single_array($mix){
foreach($mix as $single){
array_conveter($single);
}return $GLOBALS['single_array'];
$GLOBALS['single_array']=[];
}
/* Example convert your multi array to single */
$mix_array=[3,4,5,[4,6,6,7],'abc'];
print_r(single_array($mix_array));
?>
언급URL : https://stackoverflow.com/questions/6785355/convert-multidimensional-array-into-single-array
'source' 카테고리의 다른 글
MyISAM과 InnoDB의 차이점은 무엇입니까? (0) | 2022.11.05 |
---|---|
SQL 쿼리가 잘못된 결과를 제공함 (0) | 2022.11.05 |
그래프와 일치하도록 Matplotlib 색상 막대 크기 설정 (0) | 2022.11.05 |
MariaDB: JSON의 합계값 (0) | 2022.11.05 |
앱을 로드하기 전에 vuex 스토어에 데이터를 로드합니다. 이 작업을 수행하려면 어떻게 해야 합니까? (0) | 2022.11.05 |