2011-01-14 13 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かどうかを確認し、そうであれば表示し、そうでなければ増分して再試行します。あなたが推測したように、カテゴリと質問にはキーはありません(少なくとも私がループする数字ではありません)。だから、インデックスを使うことは、私が知る限り、問題外です。どのように動的にページあたり3つの質問を表示し、次のページの次の3つの質問をカテゴリ2の値が何であるかわからなくても自動的に取得できます。どのようにトラバース/ターゲット設定できますか?

おかげで、 ライアン

+0

をどのようにして二回のキーとして範疇を持つ配列を持つことができますすることができますか? – profitphp

+0

私はおそらくタイプミスと推測します。 :)。 –

+0

これらをデータベースに保存できない理由はありますか?はるかに簡単です。 – dqhendricks

答えて

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' 
       ) 
      ) 
     ) 
    ); 

そして、あなたは整数を使用することができますインデックスを作成します。

PHPは私の最も強い言語ではないので、上記のコードはネイティブのPHPプログラマーにとって奇妙に見えるかもしれません。しかし、OPの難しさの根本的な原因は、インタレータ型のオブジェクトを簡単に作成できないことです。これは、キーベースの配列がハッシュマップの性質によって与えられた「奇妙な」順序を持っているためです。 (配列インデックスとも呼ばれます)interterのようなオブジェクトです。

0

連想配列(別名ハッシュ)を使用しているため、順序はありません。各質問と各カテゴリには次の質問/カテゴリキーが必要です。その後、リンクリストアルゴリズムを参照してください。

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>';