2011-12-29 11 views
0

どのようにヘッダ配列に(SQLクエリの結果である)この多次元配列を行ヘッダーと列ヘッダーの配列に変換するにはどうすればよいですか?

array(
    0 => array(
     'x' => 'x1', 
     'y' => 'y1', 
     'count' => 2, 
    ), 
    1 => array(
     'x' => 'x3', 
     'y' => 'y1', 
     'count' => 3, 
    ), 
    2 => array(
     'x' => 'x3', 
     'y' => 'y2', 
     'count' => 4, 
    ), 
    3 => array(
     'x' => 'x1', 
     'y' => 'y2', 
     'count' => 6, 
    ), 
    4 => array(
     'x' => 'x2', 
     'y' => 'y3', 
     'count' => 7, 
    ), 
    5 => array(
     'x' => 'x2', 
     'y' => 'y2', 
     'count' => 1, 
    ), 
) 

ような配列を変換することができ:

array('x','y1','y2','y3') 

と値アレイ:

array(
    0 => array('x1',2,6,null), 
    1 => array('x2',null,1,7), 
    2 => array('x3',3,4,null), 
) 

私はresult set from a queryを取ってそれを回そうとしていますグリッド/テーブルに追加します。

(ERR ...申し訳ありませんが、私は他の質問からのように設定まったく同じ例を使用していませんでした)

私はこれを行うの素敵な、効率的な方法を考え出すとのトラブルを抱えています。


ヘッダー配列は、文字列 "x"の後に 'y'のすべての異なる値が続くようにする必要があります。一貫性を保つため、アルファベット順に並べ替えることができます。

最後の配列は、 'x'の異なる値(インデックス0を構成する)ごとに1つの行を持ち、次のインデックスは、最初の配列のそれぞれのx/y値の対応する 'count' ( 'y'値は 'header'配列内の同じインデックスによって与えられます)。欠損値はnullまたは0です。

+1

2つの配列の構築方法を説明できますか? –

+0

@AurelioDeRosa:最初のものはSQLクエリの結果です(リンクからヒントを得たものです)... 2番目は私が質問でよりよく説明できると思います。 – mpen

+0

'null '値はどこから来たのですか?それらは元の配列の一部ではありませんか?何かが欠けていますか? – hakre

答えて

1

あなたがこの素晴らしいと思うかどうかはわかりませんが、効果があるはずです。あなたはデータのみの上にforに計画している場合も、あなたは、より良いeffeciencyためksort Sを削除する可能性が...あなたはforeachをしたい場合は、それらを維持する必要があります。

$header = array('x'); 
$body = array(); 
$row_len = 0; 

foreach ($input as $cell) { 
    $x = (int) substr($cell['x'], 1); 
    $y = (int) substr($cell['y'], 1); 
    $row_len = max($row_len, $y); // use for null-padding rows later 

    $header[$y] = $cell['y']; 

    // Populate body 
    $row =& $body[$x - 1]; 
    $row[0] = $cell['x']; 
    $row[$y] = $cell['count']; 
} 

// Fill missing nulls 
foreach ($body as &$row) { 
    for ($i = 1; $i <= $row_len; $i++) { 
     if (!isset($row[$i])) { 
      $row[$i] = null; 
     } 
    } 

    // Sort rows by key (since we've treated this as assoc-array) 
    ksort($row); 
} 

// Once again, assoc arrays, you'll need to ksort 
ksort($header); 
ksort($body); 

最初のforeachがどこでありますクリティカルビットは..残りはあなたの結果の配列を正規化することです。

関連する問題