Многомерный массив / создание опроса - PullRequest
2 голосов
/ 14 января 2011

У меня есть такой массив:

$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.Как я могу пройти / нацелиться на это?

Спасибо, Райан

Ответы [ 4 ]

0 голосов
/ 15 января 2011
<code><?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 '
';

?>

И вывод:

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>';
0 голосов
/ 15 января 2011

Поскольку вы используете ассоциативный массив (он же хеш), порядок в нем отсутствует. У каждого вопроса и каждой категории должен быть следующий ключ / категория. После этого см. Алгоритмы списка ссылок.

0 голосов
/ 15 января 2011

Моя функция be array_keys() поможет вам? Вы будете повторять массив ключей (чтобы получить следующие ключи).

0 голосов
/ 15 января 2011

Данные кажутся довольно статичными, поэтому я бы предложил изменить формат данных:)

Измените массив на что-то вроде:

$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 является неспособность легко создать объект типа интегратора. Это связано с тем фактом, что массив на основе ключей имеет «странный» порядок, определяемый их характером хэш-карты. Измените природу и дайте себепостроить объект, подобный интегратору (он же индекс массива).

...