2011-01-14 97 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>';