PHP - 배열 내부에서 배열을 병합하는 방법
php에서 n개의 배열을 병합하는 방법.제 말은 어떻게 하면 다음과 같은 일을 할 수 있을까요?
array_merge(from : $result[0], to : $result[count($result)-1])
OR
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_array는 다양한 수의 인수를 사용할 수 있으므로, 약간의 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
오류
저는 복잡한 857의 답이 마음에 들었지만, 제게는 효과가 없었습니다. 왜냐하면 제 배열에는 보존해야 하는 숫자 키가 있었기 때문입니다.
사용했습니다.+
키를 보존하기 위한 연산자(숫자 키와 함께 PHP array_merge에서 제안됨) 및 사용array_reduce
배열을 병합합니다.
따라서 숫자 키를 유지하면서 어레이 내부의 어레이를 병합하려면 다음과 같이 할 수 있습니다.
<?php
$a = [
[0 => 'Test 1'],
[0 => 'Test 2', 2 => 'foo'],
[1 => 'Bar'],
];
print_r(array_reduce($a, function ($carry, $item) { return $carry + $item; }, []));
?>
결과:
Array
(
[0] => Test 1
[2] => foo
[1] => Bar
)
원하는 경우:
- array_interval에 들어가는 각 매개 변수가 실제로 배열인지 확인합니다.
- 배열 중 하나에서 병합할 특정 속성 지정
다음 기능을 사용할 수 있습니다.
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
)
)
특별한 재미: 사용자 객체(또는 연관 배열)의 배열에서 "이름"과 같은 배열이나 객체에서 하나의 속성을 분리하고 싶다면 이 기능을 사용할 수 있습니다.
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);
}
게터는 보호/개인 개체일 수 있습니다.
$namesOnly = getSinglePropFromCollection('name', $peopleResults, false);
돌아온다
Array
(
[0] => Ms. Jo
[1] => Mr. Bob
[2] => Joey
[3] => Anna
[4] => Mr. Howard
[5] => Ms. Wendle
)
사용해 보세요.
$result = array_merge($array1, $array2);
또는 array_merge 대신 +op을 사용하여 결합을 수행할 수 있습니다.
$array2 + array_fill_keys($array1, '');
언급URL : https://stackoverflow.com/questions/17041278/php-how-to-merge-arrays-inside-array
'programing' 카테고리의 다른 글
클래스에 주석을 달아 한정자가 있는 @MockBean을 생성하시겠습니까? (0) | 2023.08.09 |
---|---|
빠른 읽기 전용 외부, 읽기 쓰기 내부 속성 (0) | 2023.08.09 |
여러 진입점을 갖도록 Spring Security 3.x 구성 (0) | 2023.08.09 |
Android Studio에서 작성한 프로젝트에서 사용자 지정 글꼴을 사용하는 방법 (0) | 2023.08.09 |
브라우저에서 클라이언트 표준시 가져오기 (0) | 2023.08.09 |