PHP: 재인덱스화 대신 키를 유지하면서 두 어레이를 병합하시겠습니까?
문자열/int 키를 유지하면서 두 어레이(한 어레이는 문자열 => 값 쌍이 있고 다른 어레이는 int => 값 쌍이 있음)를 병합하려면 어떻게 해야 합니까?어느 것도 중복되지 않습니다(한쪽에는 문자열만 있고 다른 한쪽에는 정수만 있기 때문입니다).
현재 사용하고 있는 코드는 다음과 같습니다(array_merge가 정수 키로 어레이를 재색인하고 있기 때문에 동작하지 않습니다).
// get all id vars by combining the static and dynamic
$staticIdentifications = array(
Users::userID => "USERID",
Users::username => "USERNAME"
);
// get the dynamic vars, formatted: varID => varName
$companyVarIdentifications = CompanyVars::getIdentificationVarsFriendly($_SESSION['companyID']);
// merge the static and dynamic vars (*** BUT KEEP THE INT INDICES ***)
$idVars = array_merge($staticIdentifications, $companyVarIdentifications);
어레이를 간단하게 「추가」할 수 있습니다.
>> $a = array(1, 2, 3);
array (
0 => 1,
1 => 2,
2 => 3,
)
>> $b = array("a" => 1, "b" => 2, "c" => 3)
array (
'a' => 1,
'b' => 2,
'c' => 3,
)
>> $a + $b
array (
0 => 1,
1 => 2,
2 => 3,
'a' => 1,
'b' => 2,
'c' => 3,
)
당신이 가지고 있는 것을 고려하면
$replaced = array('1' => 'value1', '4' => 'value4');
$replacement = array('4' => 'value2', '6' => 'value3');
하고있다$merge = $replacement + $replaced;
출력:
Array('4' => 'value2', '6' => 'value3', '1' => 'value1');
합계의 첫 번째 배열은 최종 출력에 값을 가집니다.
하고있다$merge = $replaced + $replacement;
출력:
Array('1' => 'value1', '4' => 'value4', '6' => 'value3');
키를 보관하면서 머지를 할 수 있는 다른 가능성을 추가하고 싶습니다.
기존 어레이에 키와 값을 추가하는 것 외에+
할 수 있다는 신호array_replace
.
$a = array('foo' => 'bar', 'some' => 'string', 'me' => 'is original');
$b = array(42 => 'answer to the life and everything', 1337 => 'leet', 'me' => 'is overridden');
$merged = array_replace($a, $b);
결과는 다음과 같습니다.
Array
(
[foo] => bar
[some] => string
[me] => is overridden
[42] => answer to the life and everything
[1337] => leet
)
같은 키가 후자 배열에 의해 덮어씁니다.
또,array_replace_recursive
서브어레이에도 같은 역할을 합니다.
+ 연산자에 의한 원래의 인덱스 변경 없이 2개의 어레이를 쉽게 추가하거나 통합할 수 있습니다.이것은 larabel과 codeigniter select 드롭다운에서 많은 도움이 됩니다.
$empty_option = array(
''=>'Select Option'
);
$option_list = array(
1=>'Red',
2=>'White',
3=>'Green',
);
$arr_option = $empty_option + $option_list;
출력은 다음과 같습니다.
$arr_option = array(
''=>'Select Option'
1=>'Red',
2=>'White',
3=>'Green',
);
OP.의 요구 사항은 중복되지 않고(덮어쓰기) 키를 유지하는 것입니다.숫자 키와 같은 경우에는 가능하지만 문자열 키가 있으면 불가능할 수 있습니다.
사용하시는 경우array_merge()
숫자 키는 항상 다시 인덱싱되거나 번호가 다시 지정됩니다.
사용하시는 경우array_replace()
,array_replace_recursive()
오른쪽에서 왼쪽으로 겹치거나 덮어씁니다.첫 번째 어레이에서 같은 키의 값이 두 번째 어레이로 대체됩니다.
사용하시는 경우$array1 + $array2
코멘트대로 키가 같은 경우는 첫 번째 어레이의 값은 유지되지만 두 번째 어레이는 드롭됩니다.
커스텀 함수
이것은 제가 방금 같은 요건에 대해 작업하기 위해 쓴 제 기능입니다.어떤 목적으로든 자유롭게 사용하실 수 있습니다.
/**
* Array custom merge. Preserve indexed array key (numbers) but overwrite string key (same as PHP's `array_merge()` function).
*
* If the another array key is string, it will be overwrite the first array.<br>
* If the another array key is integer, it will be add to first array depend on duplicated key or not.
* If it is not duplicate key with the first, the key will be preserve and add to the first array.
* If it is duplicated then it will be re-index the number append to the first array.
*
* @param array $array1 The first array is main array.
* @param array ...$arrays The another arrays to merge with the first.
* @return array Return merged array.
*/
function arrayCustomMerge(array $array1, array ...$arrays): array
{
foreach ($arrays as $additionalArray) {
foreach ($additionalArray as $key => $item) {
if (is_string($key)) {
// if associative array.
// item on the right will always overwrite on the left.
$array1[$key] = $item;
} elseif (is_int($key) && !array_key_exists($key, $array1)) {
// if key is number. this should be indexed array.
// and if array 1 is not already has this key.
// add this array with the key preserved to array 1.
$array1[$key] = $item;
} else {
// if anything else...
// get all keys from array 1 (numbers only).
$array1Keys = array_filter(array_keys($array1), 'is_int');
// next key index = get max array key number + 1.
$nextKeyIndex = (intval(max($array1Keys)) + 1);
unset($array1Keys);
// set array with the next key index.
$array1[$nextKeyIndex] = $item;
unset($nextKeyIndex);
}
}// endforeach; $additionalArray
unset($item, $key);
}// endforeach;
unset($additionalArray);
return $array1;
}// arrayCustomMerge
테스트 중
<?php
$array1 = [
'cat',
'bear',
'fruitred' => 'apple',
3 => 'dog',
null => 'null',
];
$array2 = [
1 => 'polar bear',
20 => 'monkey',
'fruitred' => 'strawberry',
'fruityellow' => 'banana',
null => 'another null',
];
// require `arrayCustomMerge()` function here.
function printDebug($message)
{
echo '<pre>';
print_r($message);
echo '</pre>' . PHP_EOL;
}
echo 'array1: <br>';
printDebug($array1);
echo 'array2: <br>';
printDebug($array2);
echo PHP_EOL . '<hr>' . PHP_EOL . PHP_EOL;
echo 'arrayCustomMerge:<br>';
$merged = arrayCustomMerge($array1, $array2);
printDebug($merged);
assert($merged[0] == 'cat', 'array key 0 should be \'cat\'');
assert($merged[1] == 'bear', 'array key 1 should be \'bear\'');
assert($merged['fruitred'] == 'strawberry', 'array key \'fruitred\' should be \'strawberry\'');
assert($merged[3] == 'dog', 'array key 3 should be \'dog\'');
assert(array_search('another null', $merged) !== false, '\'another null\' should be merged.');
assert(array_search('polar bear', $merged) !== false, '\'polar bear\' should be merged.');
assert($merged[20] == 'monkey', 'array key 20 should be \'monkey\'');
assert($merged['fruityellow'] == 'banana', 'array key \'fruityellow\' should be \'banana\'');
결과물.
array1:
Array
(
[0] => cat
[1] => bear
[fruitred] => apple
[3] => dog
[] => null
)
array2:
Array
(
[1] => polar bear
[20] => monkey
[fruitred] => strawberry
[fruityellow] => banana
[] => another null
)
---
arrayCustomMerge:
Array
(
[0] => cat
[1] => bear
[fruitred] => strawberry
[3] => dog
[] => another null
[4] => polar bear
[20] => monkey
[fruityellow] => banana
)
array_replace_recursive 함수 또는 array_replace 함수를 사용해 보십시오.
$a = array('userID' => 1, 'username'=> 2);
array (
userID => 1,
username => 2
)
$b = array('userID' => 1, 'companyID' => 3);
array (
'userID' => 1,
'companyID' => 3
)
$c = array_replace_recursive($a,$b);
array (
userID => 1,
username => 2,
companyID => 3
)
http://php.net/manual/en/function.array-replace-recursive.php
언급URL : https://stackoverflow.com/questions/3292044/php-merge-two-arrays-while-keeping-keys-instead-of-reindexing
'programing' 카테고리의 다른 글
등록 후 사용자 자동 인증 (0) | 2022.10.20 |
---|---|
Composer에서 특정 커밋을 올바르게 요구하여 종속 패키지에서 사용할 수 있도록 하려면 어떻게 해야 합니까? (0) | 2022.10.20 |
mysql을 사용하여 처음 필터링된 결과에 따라 테이블 행 추가 (0) | 2022.10.20 |
Python으로 긴 줄 바꿈 (0) | 2022.10.20 |
스크립트를 실행하고 있는 Python 버전을 확인하려면 어떻게 해야 합니까? (0) | 2022.10.20 |