PHP: array_map 함수로 인덱스를 가져올 수 있습니까?
다음과 같이 php에서 지도를 사용하고 있습니다.
function func($v) {
return $v * 2;
}
$values = array(4, 6, 3);
$mapped = array_map(func, $values);
var_dump($mapped);
함수의 값 인덱스를 얻을 수 있습니까?
또한 인덱스가 필요한 코드를 작성할 때는 맵 대신 for 루프를 사용해야 합니까?
물론 할 수 있죠, 의 도움으로.
function func($v, $k)
{
// key is now $k
return $v * 2;
}
$values = array(4, 6, 3);
$mapped = array_map('func', $values, array_keys($values));
var_dump($mapped);
익명 배열을 통해 익명 함수를 매핑할 때 다음 키에 액세스할 수 없습니다.
array_map(
function($val) use ($foo) { /* ... */ },
array(key1 => val1,
key2 => val2,
/* ... */));
array_walk도 키에 액세스할 수 없습니다.array_walk는 키에 액세스할 수 있지만 어레이는 참조에 의해 전달되므로 간접 레이어가 필요합니다.
다음과 같은 솔루션이 있습니다.
쌍의 배열
원래 어레이를 변경할 예정이기 때문에 문제가 있습니다.또한 보일러 플레이트 "array()" 콜은 어레이 길이에 따라 선형적으로 증가합니다.
array_map(
function($pair) use ($foo) {
list($key, $val) = $pair;
/* ... */
},
array(array(key1, val1),
array(key2, val2),
/* ... */));
임시 변수
원래 어레이로 동작하고 있으며 보일러 플레이트는 일정하지만 기존 변수를 쉽게 클로빙할 수 있습니다.
$i_hope_this_does_not_conflict = array(key1 => val1,
key2 => val2,
/* ... */);
array_map(
function($key, $val) use ($foo) { /* ... */ },
array_keys($i_hope_this_does_not_conflict),
$i_hope_this_does_not_conflict);
unset($i_hope_this_does_not_conflict);
원샷 기능
함수 스코프를 사용하여 기존 이름의 클로빙을 방지할 수 있지만 "사용" 레이어를 추가해야 합니다.
call_user_func(
function($arr) use ($foo) {
return array_map(function($key, $val) use ($foo) { /* ... */ },
array_keys($arr),
$arr);
},
array(key1 => val1,
key2 => val2,
/* ... */));
다중 인수 원샷 함수
"사용" 보일러 플레이트를 방지하기 위해 원래 범위에서 매핑하는 함수를 정의합니다.
call_user_func(
function($f, $arr) {
return array_map($f, array_keys($arr), $arr);
},
function($key, $val) use ($foo) { /* ... */ },
array(key1 => val1,
key2 => val2,
/* ... */));
신기능
흥미로운 점은 마지막 원샷 함수는 멋진 범용 시그니처를 가지고 있으며 array_map과 매우 흡사하다는 것입니다.이름을 붙여 재사용할 수 있습니다.
function array_mapk($f, $arr) {
return array_map($f, array_keys($arr), $arr);
}
그 후, 델의 애플리케이션 코드는 다음과 같습니다.
array_mapk(
function($key, $val) use ($foo) { /* ... */ },
array(key1 => val1,
key2 => val2,
/* ... */));
간접 어레이 워크
위의 글을 쓸 때는 array_walk를 무시했습니다.왜냐하면 array_walk의 인수가 참조로 전달되어야 하기 때문입니다.그러나 그 이후로는 call_user_func를 사용하여 이 문제를 해결하는 것이 쉽다는 것을 깨달았습니다.저는 이것이 지금까지의 버전 중 최고라고 생각합니다.
call_user_func(
'array_walk',
array(key1 => val1,
key2 => val2,
/* ... */),
function($val, $key) use ($foo) { /* ... */ });
there the the the the the the the the the the the the the the the the the the the the the the the the the the there there there 에 접속할 방법이 .array_map
수치를 사용할수 .순차적 숫자 인덱스를 사용하는 경우 증분 정적 변수를 사용할 수 있습니다.
$values = ["one", "two", "three"];
$mapped = array_map(function ($value) {
static $i = 0;
$result = "Index: $i, Value: $value";
$i++;
return $result;
}, $values);
print_r($mapped);
결과:
Array
(
[0] => Index: 0, Value: one
[1] => Index: 1, Value: two
[2] => Index: 2, Value: three
)
이 접근방식을 사용할 때는 어나니머스 함수를 콜백으로 사용하여 array_map 외부에서 동일한 정적 변수를 참조하지 않도록 해당 어나니머스 함수를 재사용하지 않는 것이 중요합니다.
, 좀오 it it it it it it it it it it it it it it it it it it it it it it를 사용하고 있습니다.array_keys
:
array_map(function($id, $name) {
print '<option value="'.$id.'">'.$name.'</option>';
}, array_keys($array), array_values($array));
" " 가 " "use
을 2개의 할 수 .arrray_map
기능.설명은 필요없을 것 같은데, 암호는 꽤 간단해.
매우 심플:
array_map 기능:에만 인덱스 키가 없습니다!
$params = [4,6,2,11,20];
$data = array_map(function($v) { return ":id{$v}";}, $params);
array (size=5)
0 => string ':id4' (length=4)
1 => string ':id6' (length=4)
2 => string ':id2' (length=4)
3 => string ':id11' (length=5)
4 => string ':id20' (length=5)
이제 array_keys와 결합합니다.
$data = array_map(
function($k) use ($params) { return ":id{$k}_${params[$k]}"; },
array_keys($params)
);
array (size=5)
0 => string ':id0_4' (length=6)
1 => string ':id1_6' (length=6)
2 => string ':id2_2' (length=6)
3 => string ':id3_11' (length=7)
4 => string ':id4_20' (length=7)
앞서 게시한 답변에서 언급했듯이 콜백 함수의 본문에 키와 값이 필요한 경우 키 배열을 전달하고 원래 배열을 통해 해당 키 값에 액세스하는 것이 가장 간단합니다.
화살표 기능이 없는 이전 버전에서는use()
또는global
(전자를 권장합니다)콜백 내에서 원래 어레이에 액세스 할 수 있도록 합니다.
최신 PHP(7.4+)에서는 화살표 함수 구문을 사용합니다.(데모)
$values = [4, 6, 3];
var_export(
array_map(
fn($k) => "$k: " . $values[$k] * 2,
array_keys($values)
)
);
또, 사용해도 부끄럽지 않습니다.foreach()
참조로 값을 변경합니다.(데모)
$values = [4, 6, 3];
foreach ($values as $k => &$v) {
$v = "$k: " . $v * 2;
}
var_export($values);
다음을 사용하여 사용자 고유의 지도 기능을 만들 수 있습니다.foreach
:
<?php
function myCallback($key, $val)
{
var_dump("myCallback - key: $key, val: $val");
return $val * 2;
}
function foreachMap($callback, $givenArray) {
$result = [];
foreach ($givenArray as $key=>$val) {
$result[$key] = $callback($key, $val);
}
return $result;
}
$values = array(4, 6, 3);
$mapped = foreachMap('myCallback', $values);
var_dump($mapped);
시험: https://3v4l.org/pmFlB
빠르고 개방적인 솔루션(array_keys 등을 사용하여 어레이를 2배로 늘리지 않음)의 경우:
/**
* Array map alternative to work with values and keys of single array.
*
* Callable receives $value and $index of $sourceArray as arguments
* If keys are not preserved via $preserveKeys - $keyCallback can be used to determinate key
*
* @param array $sourceArray
* @param callable|null $valueCallback
* @param callable|null $keyCallback
* @param bool $preserveKeys
* @return array
*/
function array_map_indexed(
array $sourceArray,
?callable $valueCallback = null,
?callable $keyCallback = null,
bool $preserveKeys = true
): array {
$newArray = [];
foreach ($sourceArray as $key => $value) {
if ($preserveKeys) {
$newArray[$keyCallback ? $keyCallback($value, $key) : $key] = $valueCallback
? $valueCallback($value, $key)
: $value;
} else {
$newArray[] = $valueCallback
? $valueCallback($value, $key)
: $value;
}
}
return $newArray;
}
사용 예:
$result = array_map_indexed(
[
'a' => 'aValue',
'b' => 'bValue',
],
function($value, $index) {
return [$value, $index];
},
);
//Array ( [a] => Array ( [0] => aValue [1] => a ) [b] => Array ( [0] => bValue [1] => b ) )
$result = array_map_indexed(
[
'a' => 'aValue',
'b' => 'bValue',
],
function($value, $index) {
return $index.$value;
},
null,
false
);
//Array ( [0] => aaValue [1] => bbValue )
$result = array_map_indexed(
[
'a' => 'aValue',
'b' => 'bValue',
],
null,
function($value, $index) {
return $value === 'aValue' ? 'specificKey' : $index;
},
);
//Array ( [specificKey] => aValue [b] => bValue )
array_map에서 사용할 자체 인덱스를 생성할 수 있습니다.
function func($v, $index) {
return $v * 2;
}
$values = array(4, 6, 3);
$valuesIndex = range(0, count($values) - 1);
$mapped = array_map(func, $values, $valuesIndex);
var_dump($mapped);
위와 같이 0부터 배열 길이까지의 숫자 배열을 인덱스와 동일하게 안전하게 작성할 수 있습니다.이 두 번째 배열을 array_map에 넣고 함수에서 인덱스로 사용합니다.
array_keys() 함수를 사용하여 배열의 키를 가져온 후 foreach 루프를 사용하여 이러한 키를 루프할 수 있습니다.
$keys = array_keys($array);
foreach($keys as $key){
// do something with $key
}
언급URL : https://stackoverflow.com/questions/5868457/php-can-i-get-the-index-in-an-array-map-function
'programing' 카테고리의 다른 글
Python에는 왜 태플 이해가 없습니까? (0) | 2022.11.18 |
---|---|
워치 핸들러 vuejs의 데이터 변수에 액세스할 수 없음 (0) | 2022.11.17 |
__hash__()를 구현하는 올바르고 좋은 방법은 무엇입니까? (0) | 2022.11.17 |
arguments.callee.caller 속성이 JavaScript에서 폐지된 이유는 무엇입니까? (0) | 2022.11.17 |
MySql : 읽기 전용 옵션을 허용하시겠습니까? (0) | 2022.11.17 |