2012-09-04 3 views
1

변환하고 싶습니다.다차원 연관 배열을 변환하는 데 사용되는 PHP 배열 함수

$data1 = array(
    array('value' => '100.00', 'total' => '32'), 
    array('value' => '10.00', 'total' => '13'), 
    array('value' => '200.00', 'total' => '39'), 
    array('value' => '190.00', 'total' => '11'), 
); 
일련의 배열에 추가하는 동안 분명히, 상단 배열의 반복에 의해 로터리 방식으로이 작업을 수행 할 수있는이

$data2 = array(
    'value' => array(0 => '100.00', 1 => '10.00', 2 => '200.00', 3 => '190.00'), 
    'total' => array(0 => '32', 1 => '13', 2 => '39', 3 => '11') 
); 

,하지만 난 PHP 배열이 있어야한다는 생각 기능에 대해 잘 모르는 경우 더 간결하게이 작업을 수행 할 수 있습니다.

http://www.php.net/manual/en/ref.array.php

값은 수레와 정수 (그것이 어떤 차이가있는 경우)는 IMO 읽기 쉽게하기 때문에, 난 그냥 예제 코드에서 문자열로 추가 한이다. 최종 배열 순서는 초기 순서와 일치해야합니다. 나는 LOC에 대한 정확한 대답을 주겠다. 성능이 '긴'버전보다 현저하게 나쁘지는 않다. PHP 5.4.

하면 간단한의 foreach()을 사용하는 기능없이 할 수
+0

왜 for 루프가 좋지 않은가요? –

+0

['array_reduce()'] (http://php.net/manual/en/function.array-reduce.php) 종류의 작업을 찾고 있습니다. – moonwave99

답변

3
<?php // php 5.4 array syntax 

$new = array_reduce($data1, function (&$result, $item) 
    { 
     $result['value'][] = $item['value']; 
     $result['total'][] = $item['total']; 
     return $result; 
    }, 
    ['value' => [], 'total' => []]); 

'값'과 '전체'가 임의적을 그래서 당신은 이것을하기 위해 한 줄짜리 PHP 라이브러리 함수를 얻지 않을 것이다.

function array_rotate2($data) { 
    return array_combine(array_keys($data[0]), 
     array_map(function ($field) use ($data) { 
       return array_map(function($row) use ($field) { return $row[$field]; }, $data); 
      }, array_keys($data[0]))); 
} 
:

당신이 원한다면 당신은 함수에이 코드를 리팩토링 할 수

...

function array_rotate($data) { 
    $k = array_keys($data[0]); 
    return array_reduce($data, function (&$r, $i) use ($k) { 
     $r[$k[0]][] = $i[$k[0]]; 
     $r[$k[1]][] = $i[$k[1]]; 
     return $r; 
    }, [$k[0] => [], $k[1] => []]); 
} 
나는 매튜의 코드 @ 일반화

,이 (대신 2) 키의 임의의 수를 할 수 있습니다

+0

OP는 PHP 5.4라고 말했습니다. http://php.net/manual/en/language.references.pass.php – Mike

+0

@mike 무엇입니까? – Lusitanian

+0

'$ result'를 참조로 전달하지 않습니까? – Mike

1

:

<?php 
$data = array(
    array('value' => '100.00', 'total' => '32'), 
    array('value' => '10.00', 'total' => '13'), 
    array('value' => '200.00', 'total' => '39'), 
    array('value' => '190.00', 'total' => '11'), 
); 

$newArray = array(); 
$i=0; 
foreach($data as $value){ 
    $newArray["value"][] = $data[$i]["value"]; 
    $newArray["total"][] = $data[$i]["total"]; 
    $i++; 
} 

echo "<pre>"; 
print_r($newArray); 
echo "</pre>"; 
?> 

을 출력한다 :

Array 
(
    [value] => Array 
     (
      [0] => 100.00 
      [1] => 10.00 
      [2] => 200.00 
      [3] => 190.00 
     ) 

    [total] => Array 
     (
      [0] => 32 
      [1] => 13 
      [2] => 39 
      [3] => 11 
     ) 
) 
+0

나는 그것을 알고 있었다. 그것을 입력 해 주셔서 감사하지만, 나는 이것을 더 간결하게하는 것을 찾고 있습니다. – calumbrodie

1
$final = array(); 
foreach($data1 as $array) { 
    foreach($array as $key => $value) { 
    $final[$key] = isset($final[$key]) ? $final : array(); 
    $final[$key][] = $value; 
    } 
} 
5

PHP에 array_pluck 함수가있는 경우 간단 할 것입니다.

function array_pluck(array $array, $field) 
{ 
    return array_map(function($row) use ($field) { return $row[$field]; }, $array); 
} 

$data2 = array(
    'value' => array_pluck($data1, 'value'), 
    'total' => array_pluck($data1, 'total') 
); 

나는 그게 읽을 수만큼이나 쉽게 생각하지만, 당신은 필드 당 한 번 전체 배열을 통해 반복됩니다, 그래서 거의 최적의 솔루션 없습니다.

개인적으로 이것은 foreach 해결책을 고수하고 재사용 가능한 일부 기능으로 감싸려는 상황입니다.

+0

글쎄 이제는'array_pluck' 함수를 가지고 있습니다 :)) – moonwave99

+3

PHP 5.5는'array_column()'으로 가질 수 있습니다 : https://wiki.php.net/rfc/array_column – Matthew

+0

그냥 가리키고 있습니다. 너는 그런 기능을 제공했다. ^^ – moonwave99

1

다른 사람들은 단 한 줄로 생각하지 않는다고 말하고 있습니다. 다음은 재사용 가능한 foreach 함수입니다.

function array_multi_key_combine($a, $keys = array()) { 
    $b = array(); 
    foreach($a as $v) { 
     foreach($keys as $k) { 
      if(isset($v[$k])) $b[$k][] = $v[$k]; 
     } 
    } 
    return $b; 
} 
$data2 = array_multi_key_combine($data1, array('value', 'total'));