2011-01-14 2 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

Как вы можете иметь массив с category1 в два раза ключ? – 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' 
       ) 
      ) 
     ) 
    ); 

И вы можете использовать целое число индексы тогда. Просто запомните 2 числа (индекс категории и индекс вопроса внутри категории. И просто увеличивайте до конца массива в каждом случае.

Php не самый сильный язык, поэтому приведенный выше код может показаться странным для нативного программиста php. Однако основной причиной трудностей OP является невозможность легко создать объект типа interator. Это связано с тем, что в основе на основе ключа есть «странный» порядок, определяемый их характером хэш-карты. Измените природу и позвольте себе построить (например, индекс массива).

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>'; 
Смежные вопросы