2011-01-14 54 views
2

我有一個數組這樣的:多維陣列/創建測量

$survey = array(
     'Category1' => array(
      'Question1' => array(
       'Option1', 'Option2', 'Option3' 
      ), 
      'Question2' => array(
       'Option1', 'Option2', 'Option3' 
      ) 
     ), 
     'Category2' => array(
      'Question1' => array(
       'Option1', 'Option2', 'Option3' 
      ), 
      'Question2' => array(
       'Option1', 'Option2', 'Option3' 
      ) 
     ) 
    ); 

該數組是在實踐中要大得多。要求是每頁3個問題。我的想法是存儲我目前所在的類別和問題。例如類別0,問題2.然後檢查以查看array_key_exists如果是,則顯示,如果不是,則增量並再次嘗試。正如你可能已經猜到的那樣,類別和問題沒有鍵(至少沒有數字可以讓我循環)。因此,據我所知,使用索引是不可能的。例如,如何在不知道category2的值的情況下,如何動態顯示每頁3個問題並自動獲取下一頁的3個問題。我如何穿過/瞄準這個?

感謝, 瑞安

+0

如何你可以有組別數組作爲鍵兩次? – profitphp 2011-01-14 21:04:20

回答

0

的數據似乎相當靜態的,所以我建議陣列改變數據格式:)

變成類似:

$survey = array(
    array('name' = > 'Category1', 
      'questions' => array(
      array(
       'name' => 'Question1', 
       'opts' => array(
        'Option1', 'Option2', 'Option3' 
       ) 
      ), 
        array(
       'name' => 'Question2', 
       'opts' => array(
        'Option1', 'Option2', 'Option3' 
       ) 
      ) 
     ), 
    array('name' = > 'Category2', 
      'questions' => array(

      array(
       'name' => 'Question1', 
       'opts' => array(
        'Option1', 'Option2', 'Option3' 
       ) 
      ), 
      array(
       'name' => 'Question2', 
       'opts' => array(
        'Option1', 'Option2', 'Option3' 
       ) 
      ) 
     ) 
    ); 

你也可以使用整然後索引。只記得2個數字(類別索引和類別內的問題索引,並且在每種情況下只增加到數組的末尾。)

Php不是我最強大的語言,所以上面的代碼可能看起來奇怪的原生的PHP程序員。然而,OP難題的根本原因是無法輕易創建一個interator類型的對象,這是因爲基於key的數組有一個「奇怪」的順序,這個順序是由它們的哈希映射本質給出的,改變性​​質並允許自己構建一個類似對象的interator(又名數組索引)

0

由於你使用的是關聯數組(aka hash),所以沒有順序,每個問題和每個類別都需要有下一個問題/類別鍵然後看鏈接列表算法

0

我是array_keys()函數能幫助你嗎?您將迭代鍵數組(以獲得下一個鍵)。

0
<?php 
    $survey = array(
    'Category1' => array(
     'Question1' => array(
      'Option1', 'Option2', 'Option3' 
     ), 
     'Question2' => array(
      'Option1', 'Option2', 'Option3' 
     ), 
     'Question3' => array(
      'Option1', 'Option2', 'Option3' 
     ), 
     'Question4' => array(
      'Option1', 'Option2', 'Option3' 
     ) 
    ), 
    'Category 2' => array(
     'Question1' => array(
      'Option1', 'Option2', 'Option3' 
     ), 
     'Question2' => array(
      'Option1', 'Option2', 'Option3' 
     ) 
    ), 
    'Category 3' => array(
     'Question1' => array(
      'Option1', 'Option2', 'Option3' 
     ), 
     'Question2' => array(
      'Option1', 'Option2', 'Option3' 
     ), 
     'Question3' => array(
      'Option1', 'Option2', 'Option3' 
     ), 
    ) 
); 

function fetchQuestions($survey, $page, $perPage = 3) 
{ 
    $results = Array(); 

    $nCount = 0; $nRead = 0; $nIndex = $page * $perPage; 
    foreach ($survey as $CategoryName => $Questions) 
    { 
    foreach ($Questions as $Question => $Options) 
    { 
     if ($nCount >= $nIndex && $nRead < $perPage) 
     { 
     if (!isset($results[$CategoryName])) 
      $results[$CategoryName] = Array(); 

     $results[$CategoryName][$Question] = $Options; 

     $nRead++; 
     } 
     $nCount++; 
    } 
    } 
    return $results; 
} 
echo '<html><body><pre>'; 
var_dump(fetchQuestions($survey,0)); 
var_dump(fetchQuestions($survey,1)); 
var_dump(fetchQuestions($survey,2)); 
echo '</pre></body></html>'; 

>

和輸出:

array(1) { 
    ["Category1"]=> 
    array(3) { 
    ["Question1"]=> 
    array(3) { 
     [0]=> 
     string(7) "Option1" 
     [1]=> 
     string(7) "Option2" 
     [2]=> 
     string(7) "Option3" 
    } 
    ["Question2"]=> 
    array(3) { 
     [0]=> 
     string(7) "Option1" 
     [1]=> 
     string(7) "Option2" 
     [2]=> 
     string(7) "Option3" 
    } 
    ["Question3"]=> 
    array(3) { 
     [0]=> 
     string(7) "Option1" 
     [1]=> 
     string(7) "Option2" 
     [2]=> 
     string(7) "Option3" 
    } 
    } 
} 
array(2) { 
    ["Category1"]=> 
    array(1) { 
    ["Question4"]=> 
    array(3) { 
     [0]=> 
     string(7) "Option1" 
     [1]=> 
     string(7) "Option2" 
     [2]=> 
     string(7) "Option3" 
    } 
    } 
    ["Category 2"]=> 
    array(2) { 
    ["Question1"]=> 
    array(3) { 
     [0]=> 
     string(7) "Option1" 
     [1]=> 
     string(7) "Option2" 
     [2]=> 
     string(7) "Option3" 
    } 
    ["Question2"]=> 
    array(3) { 
     [0]=> 
     string(7) "Option1" 
     [1]=> 
     string(7) "Option2" 
     [2]=> 
     string(7) "Option3" 
    } 
    } 
} 
array(1) { 
    ["Category 3"]=> 
    array(3) { 
    ["Question1"]=> 
    array(3) { 
     [0]=> 
     string(7) "Option1" 
     [1]=> 
     string(7) "Option2" 
     [2]=> 
     string(7) "Option3" 
    } 
    ["Question2"]=> 
    array(3) { 
     [0]=> 
     string(7) "Option1" 
     [1]=> 
     string(7) "Option2" 
     [2]=> 
     string(7) "Option3" 
    } 
    ["Question3"]=> 
    array(3) { 
     [0]=> 
     string(7) "Option1" 
     [1]=> 
     string(7) "Option2" 
     [2]=> 
     string(7) "Option3" 
    } 
    } 
} 

有我的出價。返回與原始數組類似的數組,其中應顯示在該特定頁面上的問題。

如果你想有一個更直觀表示:

echo '<html><body>'; 
$page = 0; 
while (count($matches = fetchQuestions($survey,$page++)) > 0) 
{ 
    echo '<div style="background-color:#CCC;">'; 
    echo '<h2>Page '.$page.'</h2>'; 
    echo '<ul>'; 
    foreach ($matches as $Category => $Questions) 
    { 
    echo '<li><strong>'.$Category.'</strong>:<ul>'; 
    foreach ($Questions as $Question => $Options) 
    { 
     echo '<li><u>'.$Question.'</u><ul>'; 
     foreach ($Options as $Option) 
     echo '<li>'.$Option.'</li>'; 
     echo '</ul>'; 
    } 
    echo '</ul></li>'; 
    } 
    echo '</ul>'; 
    echo '</div>'; 
} 
echo '</body></html>';