多维阵列/创建调查

时间:2011-01-14 20:58:31

标签: php arrays traversal

我有一个这样的数组:

$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 :(得分: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困难的根本原因是无法轻松创建交互器类型对象。这是因为基于密钥的数组具有由其哈希映射性质给出的“奇怪”顺序。改变本质并允许自己构建类似于对象的交互器(也称为数组索引)。

答案 1 :(得分:0)

由于您正在使用关联数组(也就是哈希),因此没有顺序。每个问题和每个类别都需要有下一个问题/类别密钥。之后,请参阅链接列表算法。

答案 2 :(得分:0)

我的array_keys()功能对您有帮助吗?您将迭代键数组(以获取下一个键)。

答案 3 :(得分: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>';

&GT;

输出:

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