0

これに対する答えがある場合は事前に申し訳ありませんが、探していたものを正確に見つけることができませんでした.

現在、データベース クエリからデータ結果を多次元配列に返すレポート アプリケーションがあります。各配列は id フィールドから作成されます。IDが同じ配列を1つにマージできるようにしたいと思います。

たとえば、ここにテスト結果セットがあります。ご覧のとおり、ID が 1 のユーザーには現在 2 つの結果があります。

Array
(

    [0] => Array
    (
        [AssessmentQuestion] => 1
        [AssessmentAnswer] => 0
        [id] => 1
    )

    [1] => Array
    (
        [AssessmentQuestion] => 2
        [AssessmentAnswer] => 2
        [id] => 1
    )
)

Array
(   
    [0] => Array    
    (
        [AssessmentQuestion] => 1
        [AssessmentAnswer] => 1
        [id] => 2
    )
)

IDが同じ場合、結果セットを次のようにしたいと思います。

Array
(
    [0] => Array
    (
        [AssessmentQuestion] => 1
        [AssessmentAnswer] => 0
        [AssessmentQuestion] => 2
        [AssessmentAnswer] => 2
        [id] => 1
    )
)

よろしくお願いします。

ここに私が実行しているクエリがあります。カスタム関数 ArrayFunctions::captureArrayFromResult() があります。これは配列の結果をキャプチャするだけです。最初のクエリは、すべてのアクティブなユーザー エントリ ID を取得するだけで、ID ごとにすべての評価質問情報が返されます。

/**** COLLECT ALL ACTIVE USER ENTRY IDS ****/
$query = "SELECT DISTINCT ue.id
          FROM user_entry ue
          LEFT JOIN user_demographic_answers uda ON ue.id = uda.user_entry_id
          LEFT JOIN user_assessment_answers uaa ON ue.id = uaa.user_entry_id 
          WHERE $condition
          AND DATE(ue.datetime_finished) BETWEEN '{$this->reportDateRangeStart}' AND    '{$this->reportDateRangeEnd}'";
$results = db_Query($query);
$this->reportUserEntryID = ArrayFunctions::captureArrayFromResult($results, "id", "id");

foreach($this->reportUserEntryID as $userID)
{
    /**** COLLECT ASSESSMENT QUESTIONS ****/
    $query = SELECT DISTINCT uaa.question_id as 'AssessmentQuestion', uaa.answer_value as 'AssessmentAnswer', ue.id
          FROM user_assessment_answers uaa
          LEFT JOIN report_field_options rfo ON uaa.question_id = rfo.assessment_question_id
          LEFT JOIN user_entry ue ON uaa.user_entry_id = ue.id
          WHERE ($condition)
          AND DATE(ue.datetime_finished) BETWEEN '{$this->reportDateRangeStart}' AND '{$this->reportDateRangeEnd}'
          AND ue.id IN ($userID)
          ORDER BY uaa.question_id";
    $results = db_Query($query);
    $this->reportQuestionAssessmentAnswers = ArrayFunctions::captureArrayFromResult($results);
}
4

2 に答える 2

0

foreach ループを使用してこれを実現できます。

$main_arr = array
(
     array
     (
         'AssessmentQuestion' => 1,
         'AssessmentAnswer' => 0,
         'id' => 1
     ),
     array
     (
         'AssessmentQuestion' => 2,
         'AssessmentAnswer' => 2,
         'id'=> 1
     ),
     array
     (
         'AssessmentQuestion' => 3,
         'AssessmentAnswer' => 4,
         'id' => 2
     ),
     array
     (
        'AssessmentQuestion' => 5,
        'AssessmentAnswer' => 6,
        'id'=> 1
     )
);

foreach ($main_arr as $arr) {
     $new_arr[$arr['id']]['id']  = $arr['id'];
     $new_arr[$arr['id']]['AssessmentQuestions'][] = $arr['AssessmentQuestion'];
     $new_arr[$arr['id']]['AssessmentAnswers'][] = $arr['AssessmentAnswer'];
}
var_dump($new_arr);
于 2013-09-20T14:21:27.480 に答える
0

短い答え: 配列キーは一意でなければならないため、求めていることを実行することはできません。

ロジックを結合する際に、AssesmentQuestionsandの配列を作成することをお勧めしますAssesmentAnswers

Array
(
    [0] => Array
    (
        [id] => 1,
        [AssesmentQuestions] => Array
        (
            [0] => 1,
            [1] => 2
        ),
        [AssesmentAnswers] => Array
        (
            [0] => 0,
            [1] => 2
        )
    )
)
于 2013-09-20T13:36:40.640 に答える