PHP: суммировать массивы в многомерный массив - PullRequest
0 голосов
/ 05 июля 2018

У меня есть массив, в котором хранятся главы, вопросы и ответы. Как видно из примера, это не очень удобно.
Я хочу иметь многомерный массив.

Как лучше всего это делать в PHP?

Что у меня есть:

array(
    array(
        'chapter' => 'Chapter 1',
        'question' => 'Question 1',
        'answer' => 'Answer 1'
    ),
    array(
        'chapter' => 'Chapter 1',
        'question' => 'Question 1',
        'answer' => 'Answer 2'
    ),
    array(
        'chapter' => 'Chapter 1',
        'question' => 'Question 2',
        'answer' => 'Answer 1'
    ),
    array(
        'chapter' => 'Chapter 2',
        'question' => 'Question 1',
        'answer' => 'Answer 1'
    ),
    array(
        'chapter' => 'Chapter 2',
        'question' => 'Question 1',
        'answer' => 'Answer 2'
    )
);

Что я хочу иметь:

array(
    array(
        'chapter' => 'Chapter 1',
        'questions' => array(
            array(
                'text' => 'Question 1',
                'answers' => array(
                    'Answer 1',
                    'Answer 2'
                )
            ),
            array(
                'text' => 'Question 2',
                'answers' => array(
                    'Answer 1'
                )
            )
        )
    ),
    array(
        'chapter' => 'Chapter 2',
        'questions' => array(
            array(
                'text' => 'Question 1',
                'answers' => array(
                    'Answer 1',
                    'Answer 2'
                )
            )
        )
    )
);    

1 Ответ

0 голосов
/ 05 июля 2018

Что ж, я бы использовал комбинацию array_reduce, array_map и array_values:

<?php

$input = array(
    array(
        'chapter' => 'Chapter 1',
        'question' => 'Question 1',
        'answer' => 'Answer 1'
    ),
    array(
        'chapter' => 'Chapter 1',
        'question' => 'Question 1',
        'answer' => 'Answer 2'
    ),
    array(
        'chapter' => 'Chapter 1',
        'question' => 'Question 2',
        'answer' => 'Answer 1'
    ),
    array(
        'chapter' => 'Chapter 2',
        'question' => 'Question 1',
        'answer' => 'Answer 1'
    ),
    array(
        'chapter' => 'Chapter 2',
        'question' => 'Question 1',
        'answer' => 'Answer 2'
    )
);

$result = array_reduce(
  $input,
  function($output, $inputElem) {
    $output[$inputElem['chapter']]['chapter'] = $inputElem['chapter'];
    $output[$inputElem['chapter']]['questions'][$inputElem['question']]['text'] = $inputElem['question'];
    $output[$inputElem['chapter']]['questions'][$inputElem['question']]['answers'][] = $inputElem['answer'];
    return $output;
  },
  []
);

/* So now $result looks like this:
array(
  "Chapter 1"=> array(
    "chapter"=> "Chapter 1"
    "questions"=> array(
      "Question 1"=> array(
        "text"=> "Question 1"
        "answers"=> array(
          "Answer 1",
          "Answer 2"
        )
      )
      "Question 2"=> array(
        "text"=> "Question 2"
        "answers"=> array(
          "Answer 1"
        )
      )
    )
  )
  "Chapter 2"=> array(
    "chapter"=> "Chapter 2"
    "questions"=> array(
      "Question 1"=> array(
        "text"=> "Question 1"
        "answers"=> array(
          "Answer 1",
          "Answer 2"
        )
      )
    )
  )
)
*/

//we need to remove redundant keys now
$result = array_values( //removes main "chapter" keys
  array_map(
    function($chapter) {
      $chapter['questions'] = array_values($chapter['questions']); //removes "question" keys
      return $chapter;
    },
    $result
  )
);
var_dump($result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...