PHP - сортировка массивов в группе - PullRequest
0 голосов
/ 05 марта 2019

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

Итак, он дает мне:

{
"success": true,
"data": [
    [
        "Question",
        [
            "Answer"
        ]
    ],
    [
        "Question",
        [
            "Answer 2"
        ]
    ],
    [
        "Question 2",
        [
            "Answer 3"
        ]
    ]
],
"message": null

}

И я хочу вернутьгруппа ответов на этот вопрос, например:

{
"success": true,
"data": [
    [
        "Question",
        [
            "Answer"
        ],
        [
            "Answer 2"
        ]
    ],
    [
        "Question 2",
        [
            "Answer 3"
        ]
    ]
],
"message": null
}

И мой код выглядит так:

$questions = $this->getQRepository()->findAll();

$mappedQuestions = [];

foreach ($questions as $question){

    $title = $question->getTitle();

    $mappedQuestions[] = [
        $title,
        [
            $question->getAnswer()
        ]
    ];
}

return $mappedQuestions;

Это дает мне результат, где он группирует каждый вопрос с ответом по идентификатору, но мне нужноСгруппируйте все ответы по вопросам.Результат возвращается правильно, но сортировка неверна.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Это может сработать, но я не уверен, что это то, что вы ищете.Итак, сначала изменили ваш текущий цикл и $mappedQuestions структуру массива следующим образом:

$mappedQuestions = [];

foreach ($questions as $question){

    $mappedQuestions[] = array(
                               'title' => $question->getTitle(), 
                               'answer' => $question->getAnswer()
                          );
}

После этого, итерируйте массив еще раз, чтобы создать новый массив, который сгруппирует элементы на основе ключа массива, в данном случае это "title".

$sorted = array();
foreach ($mappedQuestions as $element) {
    $sorted[$element['title']][] = $element['answer'];
}

return $sorted;

Конечный результат $sorted:

{
   "Question":[
      "Answer",
      "Answer 2"
   ],
   "Question 2":[
      "Answer 3"
   ]

Код цикла сортировки фактически взят из этого вопроса .

Надеюсь, это поможет.

0 голосов
/ 05 марта 2019

вам нужно повторить 2 цикла, чтобы добиться этого, я взял ваш JSON в переменную $json и затем продолжил как

$json = '{
    "success": true,
    "data": [
        [
            "Question",
            [
                "Answer"
            ]
        ],
        [
            "Question",
            [
                "Answer 2"
            ]
        ],
        [
            "Question 2",
            [
                "Answer 3"
            ]
        ]
    ],
    "message": null
    }';

$arr = (array) json_decode($json, true);

foreach($arr['data'] AS $a){
    $newArr[ $a[ 0 ] ][] = array( $a[ 1 ][ 0 ] );
}

foreach($newArr AS $key => $a){
    $newArr2[] = array_merge(array($key), array_values($a));
}

$finalArr = array('success' => $arr['success'], 'data' => $newArr2, 'message' => $arr['message']);

print_r($finalArr); // this is final o/p which you want,

Примечание: это может быть не правильный ответ, но к этому сейчасу тебя есть идея как это сделать,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...