2013-09-20 7 views
0

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

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

Например, здесь приведен результат теста. Как вы видите, пользователь с идентификатором 1 в настоящее время имеет два результата.

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 
    ) 
) 

Я хотел бы, чтобы результирующий набор выглядел так, если идентификаторы одинаковы.

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

Большое спасибо.

Вот запросы, которыми я пользуюсь. Существует специальная функция ArrayFunctions :: captureArrayFromResult(), которая просто захватывает результаты массива. Первый запрос просто захватывает все активные идентификаторы входа пользователя, а затем каждый идентификатор возвращает всю информацию о вопросах оценки .

/**** 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); 
} 
+3

Там не может быть два разные значения с одним и тем же индексом. – fedorqui

+0

Отказ от комментария Фёдорки; однако вы можете изменить значение на массив значений. AssementQuestion => array (1,2) – Kyle

+0

Попробуйте использовать '$ new_array_with_unique_id = array_unique ($ your_previous_array);' – CIRCLE

ответ

0

Короткий ответ: невозможно выполнить то, о чем вы просите, поскольку ключи массива должны быть уникальными.

Я хотел бы предложить, во время вашего совмещая логики, чтобы создать массив AssesmentQuestions и AssesmentAnswers, например:

Array 
(
    [0] => Array 
    (
     [id] => 1, 
     [AssesmentQuestions] => Array 
     (
      [0] => 1, 
      [1] => 2 
     ), 
     [AssesmentAnswers] => Array 
     (
      [0] => 0, 
      [1] => 2 
     ) 
    ) 
) 
+0

Спасибо @jterry. В настоящее время я извлекаю все свои данные из одного запроса, должен ли я разбить это на несколько запросов на поле, а затем объединить информацию таким образом? –

+0

Да. Будет лучше. –

+0

Вы можете использовать мой цикл foreach, чтобы объединить их. –

0

Вы можете использовать цикл Еогеаспа для достижения этой цели:

$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); 
+0

Спасибо @Fouad Fodail. Кажется, что каждый следующий вопрос строится на предыдущем. –

+0

Я вижу, что эта функция должна запускаться только при наличии нескольких массивов с одним и тем же идентификатором. –

+0

Да. в соответствии с вашими образцами данных. –

Смежные вопросы