2014-11-01 2 views
0

아래의 배열을 아래 보이는 것과 같이 변환하려면 어떻게해야합니까? array_map 사용하려고하지만 기능을 작성하는 방법에 혼란스러워.다차원 배열 변환

array(3) { 
    ["award_year"]=> 
    array(2) { 
    [0]=> 
    string(7) "1999-01" 
    [1]=> 
    string(7) "2010-02" 
    } 
    ["award_title_user"]=> 
    array(2) { 
    [0]=> 
    string(1) "2" 
    [1]=> 
    string(2) "tt" 
    } 
    ["award_description_user"]=> 
    array(2) { 
    [0]=> 
    string(1) "2" 
    [1]=> 
    string(3) "ddd" 
    } 
} 

이 난 달성하기 위해 노력하고 무엇을 :

array(2) { 
    [0]=> 
    array(3) { 
    ["award_year"]=> 
    string(7) "2010-02" 
    ["award_title_user"]=> 
    string(2) "tt" 
    ["award_description_user"]=> 
    string(3) "ddd" 
    } 
    [1]=> 
    array(3) { 
    ["award_year"]=> 
    string(7) "1999-01" 
    ["award_title_user"]=> 
    string(1) "2" 
    ["award_description_user"]=> 
    string(1) "2" 
    } 
} 

답변

1
$newArr = []; 
foreach($oldArr as $key=>$row) { 
    foreach($row as $index=>$item) { 
     $newArr[$index][$key] = $item; 
    } 
} 

이 그것을 해결 하겠지만 더 확인하지 @tzook, 당신은

+0

위대한 작품! 감사! 나는 당신이 "데이터가 유효한지 검사하지 않는다"에 대해 무엇을 말하려고하는지 확신하지 못한다. 어떤 문제가있을 것으로 예상됩니까? –

+1

방금 ​​말했듯이 배열이 빌드되었다고 약속 할 수 있다면 아무런 문제가 없겠지만 확실하지 않은 경우에는 "조사 (isset)"등의 검사를 일부 추가하고 기본값이나 다른 값을 넣지 마십시오 –

0

중요한 것부터 먼저 언급 한 바와 같이 데이터가 유효하면 이 경우에는 bar-noy의 대답이 더 나은 대답이며, 여기에서 자세히 설명 할 방법을지지하지도 않습니다.

배열을 다룰 때, 나는 항상 함수 루프를 사용하지 말고 (예 : foreach()), 질문에서 언급 한 더 많은 기능 프로그래밍 방식을 사용합니다. array_map()과 같은 함수를 사용하십시오. 그러나 기능 프로그래밍 기능은 자신이하는 일 (코드가 Cleaner 인 이점)에 초점을 맞추어 사용하기 때문에 제공하는 특정 작업을 수행하고 싶어합니다.

array_map()에는 원래 배열과 동일한 순서로 매핑 된 배열의 키가 같으므로 여기에 원하는 단점이 있습니다. 원래의 배열을 "안쪽으로"바꿔야하지만 원하는 배열의 순서는 원래의 데이터와 반대입니다. array_map()에 적합하지 않습니다.

array_map()으로 해결할 수 있지만 실제로는 필립스가 필요할 때 일자 드라이버를 사용하는 것과 같습니다.

다음은 예입니다 :

<?php 
$awards = [ 
    "award_year" => ["1999-01", "2010-12"], 
    "award_title_user" => ["2", "tt"], 
    "award_description_user" => ["2", "ddd"] 
]; 

$remappedAwards = array_map(function($year, $title, $description){ 
    return [ 
     "award_year" => $year, 
     "award_title_user" => $title, 
     "award_description_user" => $description 
    ]; 
}, $awards["award_year"], $awards["award_title_user"], $awards["award_description_user"]); 

$remappedAwards = array_reverse($remappedAwards); 

echo "<pre>"; 
var_dump($remappedAwards); 
echo "</pre>"; 

은 분명히 내가 이상적이지 너무하는 여기에 키 이름을 하드 코딩했습니다. 하나의 일 수 있지만 일반적인 접근 방식을 고안해 냈습니다.하지만 그때까지는 코드 복잡성이 부끄럽지 않을 정도로 aaray_map()의 실제 의도를 훨씬 뛰어 넘을 것입니다. 이러한 배열 반복 기능이 조금 더 나은 구현에있어서 다른 언어

한 동작의 .reduce() (JS, CFML) 종류 반 괜찮은 대답을 마련 할 수있을 것 (JS 또는 CFML을 말한다). 그러나 PHP의 array_reduce() (및 다른 배열 반복 방법)은 을 콜백에만 전달하기 때문에 구현이 잘못되어서 손쉽게 처리됩니다. 그들은 실제로 적어도 인덱스를 전달할 필요가 있습니다. (종종 유용하지는 않지만 가끔은 유용 할 수도 있습니다.) 배열 자체를 추가 개념으로 사용하여 개념 증명 이상의 것을 만들 수 있습니다. IMO, 분명히 (나는 바이어스되었다. PHP보다 JS & CFML이 더 많으므로 내 기대치가 높다).

하단 라인 : array_map()은 여기 요구 사항에 적합하지 않았지만 어레이 조작에 대한 함수 프로그래밍 방식이 요구 사항과 일치하는 일반적인 루핑보다 더 나은 접근 방법이라고 생각합니다. 기능.

+0

@ anil-astrio에 관심이 있다면 : 블로그에서이 질문에 대답하기 위해'array_reduce()'를 사용하여 조사합니다 : http://blog.adamcameron.me/2014/11/php-cfml-mapping-and- reduce.html –

+0

정보를 주셔서 감사합니다. 지금 앰프에 대해 배웁니다. –

+0

도움이되기를 기쁘게 생각합니다. –