development

PHP-배열 내부의 배열 병합 방법

big-blog 2020. 12. 26. 16:31
반응형

PHP-배열 내부의 배열 병합 방법


PHP에서 n 개의 배열을 병합하는 방법. 다음과 같은 일을 어떻게 할 수
array_merge(from : $result[0], to : $result[count($result)-1])
있습니까? 또는
array_merge_recursive(from: $result[0], to : $result[count($result) -1])


$result다음과 같이 내부에 여러 배열이있는 배열은 어디에 있습니까?

$result = Array(
0 => array(),//associative array
1 => array(),//associative array
2 => array(),//associative array
3 => array()//associative array
)

내 결과는 다음과 같습니다.

$result = Array(
    0 => Array(
        "name" => "Name",
        "events" => 1,
        "types" => 2
    ),
    1 => Array(
        "name" => "Name",
        "events" => 1,
        "types" => 3
    ),
    2 => Array(
        "name" => "Name",
        "events" => 1,
        "types" => 4
    ),
    3 => Array(
        "name" => "Name",
        "events" => 2,
        "types" => 2
    ),
    4 => Array(
        "name" => "Name",
        "events" => 3,
        "types" => 2
    )
)

그리고 내가 필요한 것은

$result = Array(
"name" => "name",
"events" => array(1,2,3),
"types" => array(2,3,4)
)

array_merge 는 가변 개수의 인수를 취할 수 있으므로 약간의 call_user_func_array 속임수로 $result배열을 전달할 수 있습니다.

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

이것은 기본적으로 입력했을 때와 같이 실행됩니다.

$merged = array_merge($result[0], $result[1], .... $result[n]);

최신 정보:

이제 5.6에서는 배열을 인수로 압축 해제 하는 ...연산자 가 있으므로 다음을 수행 할 수 있습니다.

$merged = array_merge(...$result);

그리고 같은 결과가 있습니다. *

* 압축을 푼 배열에 정수 키가 있으면 동일한 결과가 E_RECOVERABLE_ERROR : type 4096 -- Cannot unpack array with string keys발생합니다. 그렇지 않으면 오류가 발생합니다.


원하는 경우 :

  • array_merge로 들어가는 각 매개 변수가 실제로 배열인지 확인하십시오.
  • 병합 할 배열 중 하나 내에서 특정 속성을 지정합니다.

이 기능을 사용할 수 있습니다.

function mergeArrayofArrays($array, $property = null)
{
    return array_reduce(
        (array) $array, // make sure this is an array too, or array_reduce is mad.
        function($carry, $item) use ($property) {

            $mergeOnProperty = (!$property) ?
                    $item :
                    (is_array($item) ? $item[$property] : $item->$property);

            return is_array($mergeOnProperty)
                ? array_merge($carry, $mergeOnProperty)
                : $carry;
    }, array()); // start the carry with empty array
}

실제 동작을 보겠습니다. 여기에 몇 가지 데이터가 있습니다.

단순 구조 : 병합 할 순수한 배열입니다.

$peopleByTypesSimple = [
    'teachers' => [
            0  => (object) ['name' => 'Ms. Jo', 'hair_color' => 'brown'],
            1  => (object) ['name' => 'Mr. Bob', 'hair_color' => 'red'],
    ],

    'students' => [
            0  => (object) ['name' => 'Joey', 'hair_color' => 'blonde'],
            1  => (object) ['name' => 'Anna', 'hair_color' => 'Strawberry Blonde'],
    ],

    'parents' => [
            0  => (object) ['name' => 'Mr. Howard', 'hair_color' => 'black'],
            1  => (object) ['name' => 'Ms. Wendle', 'hair_color' => 'Auburn'],
    ],
];

더 적은 간단한 : 배열의 배열 만 지정하고 싶은 사람들무시 수를 .

$peopleByTypes = [
    'teachers' => [
        'count' => 2,
        'people' => [
            0  => (object) ['name' => 'Ms. Jo', 'hair_color' => 'brown'],
            1  => (object) ['name' => 'Mr. Bob', 'hair_color' => 'red'],
        ]
    ],

    'students' => [
        'count' => 2,
        'people' => [
            0  => (object) ['name' => 'Joey', 'hair_color' => 'blonde'],
            1  => (object) ['name' => 'Anna', 'hair_color' => 'Strawberry Blonde'],
        ]
    ],

    'parents' => [
        'count' => 2,
        'people' => [
            0  => (object) ['name' => 'Mr. Howard', 'hair_color' => 'black'],
            1  => (object) ['name' => 'Ms. Wendle', 'hair_color' => 'Auburn'],
        ]
    ],
];

실행

$peopleSimple = mergeArrayofArrays($peopleByTypesSimple);
$people = mergeArrayofArrays($peopleByTypes, 'people');

결과-둘 다 다음을 반환합니다.

Array
(
    [0] => stdClass Object
        (
            [name] => Ms. Jo
            [hair_color] => brown
        )

    [1] => stdClass Object
        (
            [name] => Mr. Bob
            [hair_color] => red
        )

    [2] => stdClass Object
        (
            [name] => Joey
            [hair_color] => blonde
        )

    [3] => stdClass Object
        (
            [name] => Anna
            [hair_color] => Strawberry Blonde
        )

    [4] => stdClass Object
        (
            [name] => Mr. Howard
            [hair_color] => black
        )

    [5] => stdClass Object
        (
            [name] => Ms. Wendle
            [hair_color] => Auburn
        )

)

Extra Fun : 사람 객체 (또는 연관 배열) 의 배열 에서 "name"과 같이 배열 또는 객체에서 하나의 속성을 골라 내려면 이 함수를 사용할 수 있습니다.

function getSinglePropFromCollection($propName, $collection, $getter = true)
{
    return (empty($collection)) ? [] : array_map(function($item) use ($propName) {
        return is_array($item) 
            ? $item[$propName] 
            : ($getter) 
                ? $item->{'get' . ucwords($propName)}()
                : $item->{$propName}
    }, $collection);
}

getter는 보호 된 / 개인용 개체를위한 것입니다.

$namesOnly = getSinglePropFromCollection('name', $peopleResults, false);

보고

Array
(
    [0] => Ms. Jo
    [1] => Mr. Bob
    [2] => Joey
    [3] => Anna
    [4] => Mr. Howard
    [5] => Ms. Wendle
)

나는 complex857의 ​​대답을 정말로 좋아했지만 그것은 내가 보존해야 할 배열에 숫자 키가 있었기 때문에 작동하지 않았습니다.

I used the + operator to preserve the keys (as suggested in PHP array_merge with numerical keys) and used array_reduce to merge the array.

So if you want to merge arrays inside an array while preserving numerical keys you can do it as follows:

<?php
$a = [
    [0 => 'Test 1'],
    [0 => 'Test 2', 2 => 'foo'],
    [1 => 'Bar'],
];    

print_r(array_reduce($a, function ($carry, $item) { return $carry + $item; }, []));
?>

Result:

Array
(
    [0] => Test 1
    [2] => foo
    [1] => Bar
)

Try this

$result = array_merge($array1, $array2);

Or, instead of array_merge, you can use the + op which performs a union:

$array2 + array_fill_keys($array1, '');

ReferenceURL : https://stackoverflow.com/questions/17041278/php-how-to-merge-arrays-inside-array

반응형