source

다차원 어레이를 단일 어레이로 변환

goodcode 2022. 11. 5. 11:38
반응형

다차원 어레이를 단일 어레이로 변환

이유 없이 다차원 배열이 있습니다.

/* 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]에의 액세스를 하드 코드로 해, 기능이나 콜을 추가하지 않게 할 수 있습니다.

(코드 데모)

  1. array_walk_filename()은 편리하고 다용도이지만, 이 작업에서는 과잉으로 인해 가독성 면에서 다소 복잡할 수 있습니다.

    array_walk_recursive($array, function($leafvalue)use(&$flat){$flat[] = $leafvalue;});
    var_export($flat);
    
  2. 이것이 내 코드라면 array_column()을 사용합니다.이는 직접적이고 실행 중인 액션에 대해 문자 그대로 말하기 때문입니다.

    var_export(array_column($array[0], 'plan'));
    
  3. 물론 언어 구조가 함수 호출보다 더 효율적으로 수행되기 때문에 몇 가지 'foreach' 루프는 매우 효율적으로 수행됩니다.

    foreach ($array[0] as $plans) {
        foreach ($plans as $value) {
            $flat[] = $value;
        }
    }
    var_export($flat);
    
  4. 마지막으로 펑키한 대체 수단으로서(제가 좋아하지 않는 사람을 위해 코드를 쓰지 않는 한 실제로 사용하는 것은 상상할 수 없습니다) 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

반응형