2011-10-19 47 views
0

看看下面的數組:如何將數組轉換爲表?

$rows = array(
    'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 
    'f' => 6, 'g' => 7, 'h' => 8, 'i' => 9, 'j' => 10 
); 

我希望把這個表,從上到下閱讀,從左到右,像這樣:

a 1 c 3 e 5 g 7 i 9 
b 2 d 4 f 6 h 8 j 10 

至於輸入我的表創建功能,我需要的陣列,以被變換成一個,其中每個項目描述表中的行,如下所示:

Array(
[0] => Array(
    a => 1 
    c => 3 
    e => 5 
    g => 7 
    i => 9 
) 
[1] => Array(
    b => 2 
    d => 4 
    f => 6 
    h => 8 
    j => 10 
) 

下面的代碼是我的嘗試,但我不能克等它充分工作:

$cols_length = 5; 
$rows_length = (int) ceil(count($rows)/$cols_length); // 2 
$keys = array_keys($rows); 
$values = array_values($rows); 

$output = array(); 
for ($i = 0; $i < $rows_length; $i++) { 
    for ($j = 0; $j < $cols_length; $j++) { 
    $key = $i + ($j * $rows_length); 
    if (array_key_exists($key, $keys)) { 
     $output[$i][$keys[$i + $j]] = $values[$key]; 
    } 
    } 
} 

print_r($output); 

現在輸出:

Array(
[0] => Array 
    (
     [c] => 1 
     [d] => 3 
     [e] => 5 
     [f] => 7 
     [g] => 9 
    ) 

[1] => Array 
    (
     [d] => 2 
     [e] => 4 
     [f] => 6 
     [g] => 8 
     [h] => 10 
    ) 
) 

我在做什麼錯?

[編輯]

謝謝您的答覆。它工作的很棒:)然而,我犯了一個錯誤。輸出陣列應構造如下:

Array (
    [0] => Array (
     [0] => a 
     [1] => 1 
     [2] => c 
     [3] => 3 
     [4] => e 
     [5] => 5 
     [6] => g 
     [7] => 7 
     [8] => i 
     [9] => 9 
    ) 
    [1] => Array (
     [0] => b 
     [1] => 2 
     [2] => d 
     [3] => 4 
     [4] => f 
     [5] => 6 
     [6] => h 
     [7] => 8 
     [8] => j 
     [9] => 10 
    ) 
) 

我試圖修改代碼來支持這個輸出,但我得到奇怪的結果。我應該使用額外的$ j ++計數器嗎?

$i = 0; 
foreach($rows as $key => $value) { 
    $result[$i++ % 2][] = $key; 
    $result[$i++ % 2][] = $value; 
} 

回答

2

可以使用模運算符(%)以確定該元件是否應在第一或第二行:

$rows = array(
    'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 
    'f' => 6, 'g' => 7, 'h' => 8, 'i' => 9, 'j' => 10 
); 

$result = array(); 

$i = 0; 
foreach($rows as $key => $value) { 
    if(!isset($result[$i % 2])) { 
     $result[$i % 2] = array(); 
    } 
    $result[$i % 2][$key] = $value; 
    $i++; 
} 

print_r($result); 

工作實施例:

http://codepad.org/Xz2CWYof

即使您需要更多行,只需將% 2增加到需要的行數。

+1

您完全可以放棄'!isset($ result [$ i%2])'檢查,PHP將立即創建中間數組。因此,它可以是這樣簡短的:http://codepad.org/gQW9n9ty – deceze

+0

請參閱我編輯的編輯...我在輸出數組應該看起來像一個錯誤。有什麼想法嗎? – Pr0no