2012-11-29 3 views
1

어떻게 하나의 배열을 하위 키로 분할 할 수 있습니까?배열을 연관 키 배열로 효율적으로 분할하는 방법은 무엇입니까?

$arr = array(
      0 => array(
         'foo' => '1', 
         'bar' => 'A' 
         ), 
      1 => array(
         'foo' => '2', 
         'bar' => 'B' 
         ), 
      2 => array(
         'foo' => '3', 
         'bar' => 'C' 
         ) 
      ); 

foo는의 배열을 반환 별도로 막대 할 수있는 가장 효율적인 방법은 무엇입니까?

나는 여기에 도착해야합니다 나는 비슷한 array_map 또는 무언가를 사용하여이 작업을 수행하는 영리한 방법이 바라고 있어요

$foo = array('1','2','3'); 
$bar = array('A','B','C'); 

. 어떤 아이디어?

또는 루프를 통과시켜 각 어레이를 그런 식으로 구축해야합니까? 같은 뭔가 : 행운 우연의 일치에

foreach ($arr as $v) { 
    $foo[] = $v['foo']; 
    $bar[] = $v['bar']; 
} 

답변

1

, 나는 오늘 아침 거의 똑같은 일을 할 필요가 있었다. 당신은 array_shift()와 함께 array_map()을 사용할 수 있습니다 : $arr이 전달됩니다

$foo = array_map('array_shift', &$arr); 
$bar = array_map('array_shift', &$arr); 

참고가 참고로! 그렇게하지 않으면 매번 $arr[<index>]['foo']의 내용을 반환합니다. 그러나 다시 참조로 인해 - 당신은 $arr을 재사용 할 수 없으므로 그렇게해야한다면 먼저 복사하십시오.

array_shift()은 실제로 키가 무엇인지 알지 못하므로 배열 키가 예제와 같은 순서로 정렬되어야한다는 단점이 있습니다. 그것은 다음과 같은 배열에 작동하지 않습니다

$arr = array(
    0 => array(
     'foo' => '1', 
     'bar' => 'A' 
    ), 
    1 => array(
     'bar' => 'B', 
     'foo' => '2' 
    ), 
    2 => array(
     'foo' => '3', 
     'bar' => 'C' 
    ) 
); 

업데이트 :

코멘트를 읽은 후, 내 솔루션은-패스에 의해 참조 통화 시간 E_DEPRECATED 경고를 트리거 것이 분명했다.

$foo = array_map('array_shift', $arr); 
$bar = array_map('array_pop', $arr); 
+0

정말 같은 문제가 있다고 생각하지 않는다면 에러가 발생한다는 것을 알았을 것입니다. http://3v4l.org/BEmL1 – Baba

+1

대신 http://3v4l.org/1QvbN을 사용하도록 코드를 업데이트하십시오. – Baba

+0

잘 잡으세요! 내 php.ini를 업데이트해야한다고 생각합니다. 그러나, 나는 거의해야한다고 말했다. 단지 내가해야 할 일은 단지 'foo'를 얻는 것이므로 참조로 전달하는 것은 필요하지 않았다. – Narf

0
$n = array(); 

foreach($arr as $key=>$val) { 
    foreach($val as $k=>$v) { 
     $n[$k][] = $v; 
    } 
} 
0

array_merge_recursive은 함께 스칼라 값을 결합합니다 다음은이 필요한 키 두 번째 차원 배열의 처음과 마지막 요소 인 활용 @Baba에 의해 제안 된 (그리고 답변으로 인정) 대안이다 동일한 키를 배열에 넣습니다. 예 :

array_merge_recursive(array('a',1), array('b',2)) === array(array('a','b'),array(1,2)); 
당신은 단순히 별도의 인수로 배열의 각 배열을 통해 array_merge_recursive을 적용하려면이 속성을 사용할 수 있습니다

:

array (
    'foo' => 
    array (
    0 => '1', 
    1 => '2', 
    2 => '3', 
), 
    'bar' => 
    array (
    0 => 'A', 
    1 => 'B', 
    2 => 'C', 
), 
) 

그것을 :

call_user_func_array('array_merge_recursive', $arr); 

당신은이 결과를 얻을 것이다 다른 순서로 키들을 혼동하지 않습니다.

그러나 모든 병합 된 값은 스칼라 여야합니다! 배열 병합 대신 하위 배열로 추가됩니다

array_merge_recursive(array(1), array(array(2)) === array(array(1,2)) 

그것은 하지array(array(1, array(2)))을 생산 않습니다!