문제

예를 들어 데이터베이스를 쿼리 하고이 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에서 공식 교체를 사용할 수 있습니다.

https://github.com/ramsey/array_column

나는 이것이 당신이 원하는 것을 할 것이라고 생각합니다

array_uintersect_uassoc

당신은 이런 일을해야 할 것입니다

$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;
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top