确定问题的选择-php regex


Determine choices for questions - php regex

我有一个来自数组的结果。我使用这个正则表达式preg_split('/(?=[a-z'd]+'.(?!'d))/', $str, -1, PREG_SPLIT_NO_EMPTY) 得到了这个结果

Array
(
    [0] => 1. What is foo?
    [1] => a. foo1
    [2] => b. foo2
    [3] => c. foo3
    [4] => d. foo4
    [5] => 2. What is foo 2.1? 
    [6] => a. foo3
    [7] => b. foo4
    [8] => c. foo1
    [9] => d. foo2
)

我想对这些选择做的是,它们知道自己属于哪个问题(即索引[1]到索引[4]属于索引[0])

您可以循环遍历数组并检查第一个字符:如果它是一个数字,则必须有一个新的问题,因此当前字符后面的条目是答案,直到您再次获得数字。

这样试试:https://eval.in/281411

$entries = array(
    0 => '1. What is foo?',
    1 => 'a. foo1',
    2 => 'b. foo2',
    3 => 'c. foo3',
    4 => 'd. foo4',
    5 => '2. What is foo 2.1?', 
    6 => 'a. foo3',
    7 => 'b. foo4',
    8 => 'c. foo1',
    9 => 'd. foo2'
);
$questions = array();
$currentQuestion = null;
foreach($entries as $entry) {
  if(is_numeric(substr($entry, 0, 1)) === true) {
      $currentQuestion = $entry;
      $questions[$entry] = array();
      continue;
  }
  $questions[$currentQuestion][] = $entry;
}
var_dump($questions);

数组块

您可以使用array_chunk(假设每个问答有1个问题和4个可能的答案)。索引0将始终是一个问题,然后您就有了可能的答案。

array_chunk($array, 5);

https://eval.in/281396

foreach()

您可以使用foreach方法,并使用strpos检查元素是否为问题。这将把每个问题和答案分组在自己的数组中,插入0键将是问题。它比array_chunk方法更灵活,因为它允许4个以上的答案。

foreach($array as $key => $qanda) {
   if( strpos($qanda, "?") ) {
      $final[$key] = array($qanda);
      $question = $key;
      continue;
   }
   $final[$question][] = $qanda; 
}

https://eval.in/281412

还有一个问题是调整正则表达式并使用preg_match_all:

$str = '1. What is Foo? a. foo1 b. foo2 c. foo3 d. foo4 e. foo5 2. What is foo 2.1? a. foo3 b. foo4 c. foo1 d. foo2';
preg_match_all('/(?:('d+'..+?)|([a-z]+'..+?))(?=[a-z'd]+'.(?!'d)|'z)/', $str, $m);
# questions
print_r($m[1]);
Array
(
    [0] => 1. What is Foo?
    [1] =>
    [2] =>
    [3] =>
    [4] =>
    [5] =>
    [6] => 2. What is foo 2.1?
    [7] =>
    [8] =>
    [9] =>
    [10] =>
)
# multiple choices
print_r($m[2]);
Array
(
    [0] =>
    [1] => a. foo1
    [2] => b. foo2
    [3] => c. foo3
    [4] => d. foo4
    [5] => e. foo5
    [6] =>
    [7] => a. foo3
    [8] => b. foo4
    [9] => c. foo1
    [10] => d. foo2
)