요소 중 하나에 걸쳐 다차원 PHP 배열 슬라이스
-
03-07-2019 - |
문제
예를 들어 데이터베이스를 쿼리 하고이 2D 배열을 받았습니다.
$results = array(
array('id' => 1, 'name' => 'red' , 'spin' => 1),
array('id' => 2, 'name' => 'green', 'spin' => -1),
array('id' => 3, 'name' => 'blue' , 'spin' => .5)
);
나는 종종 이런 루프를 쓰는 것을 발견합니다.
foreach($results as $result)
$names[] = $result['name'];
내 질문은 루프를 사용하지 않고이 배열 $ 이름을 얻는 방법이 있습니까? 콜백 함수 사용은 루프를 사용하는 것으로 계산됩니다.
다음은 모든 분야를 얻는보다 일반적인 예입니다.
foreach($results as $result)
foreach($result as $key => $value)
$fields[$key][] = $value;
해결책
PHP-5.5에서 6 월 20 일 현재 새로운 기능이 있습니다. array_column
예를 들어:
$records = array(
array(
'id' => 2135,
'first_name' => 'John',
'last_name' => 'Doe'
),
array(
'id' => 3245,
'first_name' => 'Sally',
'last_name' => 'Smith'
),
array(
'id' => 5342,
'first_name' => 'Jane',
'last_name' => 'Jones'
),
array(
'id' => 5623,
'first_name' => 'Peter',
'last_name' => 'Doe'
)
);
$firstNames = array_column($records, 'first_name');
print_r($firstNames);
돌아올 것입니다
Array
(
[0] => John
[1] => Sally
[2] => Jane
[3] => Peter
)
위에서 언급 한 링크에는 더 많은 예가 있습니다.
다른 팁
내장 기능으로 요구하는 일을 할 수있는 방법이 없기 때문에 @Devon의 응답에 투표했습니다. 당신이 할 수있는 최선은 자신의 다음과 같습니다.
function array_column($array, $column)
{
$ret = array();
foreach ($array as $row) $ret[] = $row[$column];
return $ret;
}
PHP 5.3을 시작하면 Lambda 기능과 함께이 예쁜 호출을 사용할 수 있습니다.
$names = array_map(function ($v){ return $v['name']; }, $results);
이렇게하면 '이름'차원으로 얇게 썬 배열이 반환됩니다.
간단히 말해, 아니요.
루프 또는 콜백 기능을 사용해야합니다. Array_walk.
나는 이것에 대해 더 많은 연구를했고 루비와 프로토 타입은 이것을 부르는 기능을 가지고 있음을 발견했습니다. Array_pluck,2. 흥미 롭습니다 array_map
내가 여기서하고 싶은 일을 역전시킬 수있는 두 번째 용도가 있습니다. 나는 또한 PHP를 찾았습니다 수업 누군가가 배열의 조작을 모방하기 위해 글을 쓰고 있습니다.
나는 좀 더 파고 들고 다른 것을 찾지 못하면 internals@lists.p.net 메일 링리스트에 제출하기 위해 패치에서 작업하고 Array_pluck을 추가 할 것인지 확인할 것입니다.
업그레이드 할 수없는 사람들을 위해 PHP5.5
지금이 기능이 필요합니다. 여기에 구현이 있습니다. array_column
.
function array_column($array, $column){
$a2 = array();
array_map(function ($a1) use ($column, &$a2){
array_push($a2, $a1[$column]);
}, $array);
return $a2;
}
5.5 전에 PHP 버전을 실행하는 경우 array_column()
, 당신은 일반 PHP에서 공식 교체를 사용할 수 있습니다.
나는 이것이 당신이 원하는 것을 할 것이라고 생각합니다
당신은 이런 일을해야 할 것입니다
$results = array(
array('id' => 1, 'name' => 'red' , 'spin' => 1),
array('id' => 2, 'name' => 'green', 'spin' => -1),
array('id' => 3, 'name' => 'blue' , 'spin' => .5)
);
$name = array_uintersect_uassoc( $results, array('name' => 'value') , 0, "cmpKey");
print_r($name);
//////////////////////////////////////////////////
// FUNCTIONS
//////////////////////////////////////////////////
function cmpKey($key1, $key2) {
if ($key1 == $key2) {
return 0;
} else {
return -1;
}
}
그러나 PHP5에 액세스 할 수 없으므로 테스트하지 않았습니다.
당신은 할 수 있습니다 :
$tmp = array_flip($names);
$names = array_keys($tmp);
이것은 array_column ()의 빠른 기능 대안입니다.
if(!function_exists('array_column')) {
function array_column($element_name) {
$ele = array_map(function($element) {
return $element[$element_name];
}, $a);
return $ele;
}
}