randomise part of an object array

2019-08-23 23:19发布

问题:

I have an array of object .First I shuffle it.I want to sort array based on two key

"questions": [
    {
      "id_question": "35",
      "id_subject": "63",
      "id_question_pattern": "1",
      "correct_marks": "1",
      "in_correct_marks": "0",
      "partial_marks": "0",
      "id_question_interpretation": "1",
      "id_comprehension": "0",
      "is_approved": "13",
      "question_image": "",
      "solution_image": "",
      "subject_name": "subject 1",
      "id_sub_subject": "112",
      "sub_subject_name": "Sub Subject 2",
      "id_topic": "212",
      "topic_name": "Sub subject 2 topic 1",
      "id_sub_topic": "31",
      "sub_topic_name": "subject 1 sub topic 2 Q3",
      "id_question_source": "3",
      "question_source_name": "Dakshana intimal\t",
      "id_difficult_level": "4",
      "difficulty_name": "Difficult",
      "quesion_pattern_name": "Single Correct Option Type ",
      "id_status": "0",
      "status_name": "Active",
      "last_review_date": "2018-10-31 11:05:14",
      "id_review_requirement": "2",
      "id_time_for_question": "2",
      "answer": "",
      "is_answered": "1",
      "is_visited": "1",
      "mark_for_review": "1",
      "is_not_answered": "1",
      "id_selected_option": "",
      "single_correct_option": "",
      "number_of_visted": "0",
      "spend_time": "0",
      "multiple_correct_option": "",
      "matxi_answer": "",
      "id_subject_section": "",
      "sequence_number": 1
    },
    {
      "id_question": "11",
      "id_subject": "6",
      "id_question_pattern": "1",
      "correct_marks": "2",
      "in_correct_marks": "1",
      "partial_marks": "0",
      "id_question_interpretation": "1",
      "id_comprehension": "0",
      "is_approved": "13",
      "question_image": "",
      "solution_image": "",
      "subject_name": "Mathematics",
      "id_sub_subject": "5",
      "sub_subject_name": "Algebra",
      "id_topic": "31",
      "topic_name": "Mathematical Induction",
      "id_sub_topic": "44",
      "sub_topic_name": "Mathematical induction 1",
      "id_question_source": "3",
      "question_source_name": "Dakshana intimal\t",
      "id_difficult_level": "3",
      "difficulty_name": "Medium",
      "quesion_pattern_name": "Single Correct Option Type ",
      "id_status": "0",
      "status_name": "Active",
      "last_review_date": "2018-10-24 16:20:13",
      "id_review_requirement": "1",
      "id_time_for_question": "3",
      "answer": "",
      "is_answered": "1",
      "is_visited": "1",
      "mark_for_review": "1",
      "is_not_answered": "1",
      "id_selected_option": "",
      "single_correct_option": "",
      "number_of_visted": "0",
      "spend_time": "0",
      "multiple_correct_option": "",
      "matxi_answer": "",
      "id_subject_section": "",
      "sequence_number": 2
    },
    {
      "id_question": "25",
      "id_subject": "4",
      "id_question_pattern": "1",
      "correct_marks": "2",
      "in_correct_marks": "0",
      "partial_marks": "0",
      "id_question_interpretation": "2",
      "id_comprehension": "0",
      "is_approved": "13",
      "question_image": "",
      "solution_image": "",
      "subject_name": "Chemistry",
      "id_sub_subject": "1",
      "sub_subject_name": "Optics",
      "id_topic": "1",
      "topic_name": "Thermo dynamics",
      "id_sub_topic": "46",
      "sub_topic_name": "sub topic thermodyn chemistry",
      "id_question_source": "3",
      "question_source_name": "Dakshana intimal\t",
      "id_difficult_level": "1",
      "difficulty_name": "Very Easy",
      "quesion_pattern_name": "Single Correct Option Type ",
      "id_status": "0",
      "status_name": "Active",
      "last_review_date": "2018-10-26 12:05:28",
      "id_review_requirement": "1",
      "id_time_for_question": "1",
      "answer": "",
      "is_answered": "1",
      "is_visited": "1",
      "mark_for_review": "1",
      "is_not_answered": "1",
      "id_selected_option": "",
      "single_correct_option": "",
      "number_of_visted": "0",
      "spend_time": "0",
      "multiple_correct_option": "",
      "matxi_answer": "",
      "id_subject_section": "",
      "sequence_number": 3
    },
    {
      "id_question": "6",
      "id_subject": "4",
      "id_question_pattern": "1",
      "correct_marks": "2",
      "in_correct_marks": "0",
      "partial_marks": "0",
      "id_question_interpretation": "2",
      "id_comprehension": "0",
      "is_approved": "13",
      "question_image": "",
      "solution_image": "",
      "subject_name": "Chemistry",
      "id_sub_subject": "1",
      "sub_subject_name": "Optics",
      "id_topic": "1",
      "topic_name": "Thermo dynamics",
      "id_sub_topic": "46",
      "sub_topic_name": "sub topic thermodyn chemistry",
      "id_question_source": "3",
      "question_source_name": "Dakshana intimal\t",
      "id_difficult_level": "2",
      "difficulty_name": "Easy",
      "quesion_pattern_name": "Single Correct Option Type ",
      "id_status": "0",
      "status_name": "Active",
      "last_review_date": "2018-10-24 16:15:48",
      "id_review_requirement": "1",
      "id_time_for_question": "2",
      "answer": "",
      "is_answered": "1",
      "is_visited": "1",
      "mark_for_review": "1",
      "is_not_answered": "1",
      "id_selected_option": "",
      "single_correct_option": "",
      "number_of_visted": "0",
      "spend_time": "0",
      "multiple_correct_option": "",
      "matxi_answer": "",
      "id_subject_section": "",
      "sequence_number": 4
    }       

  ]

I want to change id_question with in_subject every time.

foreach ($questions_array as $key => $row){
 $subject_sort[$key] = $row['id_subject'];
 $question_pattern_sort[$key] = $row['id_question_pattern'];
} 

array_multisort($question_pattern_sort, SORT_ASC, $subject_sort, SORT_ASC, $questions_array);

回答1:

If I understand your question correctly, what you can do is loop through your array and set id_question = id_subject for each element of the array.

Like so:

foreach($questions_array['questions'] as $key=>$value){

  $questions_array['questions'][$key]['id_question'] = $questions_array['questions'][$key]['id_subject'];  

}


回答2:

To sort by id_subject then id_question_pattern, I can recommend one of two approaches (depending on your php version).

The spaceship operator with usort(): (Demo)

usort($array["questions"], 
      function($a, $b){
          return [$a['id_subject'], $a['id_question_pattern']] <=> [$b['id_subject'], $b['id_question_pattern']];
      }
);

or with array_multisort() (Demo)

array_multisort(array_column($array["questions"], "id_subject"), SORT_ASC, array_column($array["questions"], "id_question_pattern"), SORT_ASC, $array["questions"]);

Take care to realize that you are wanting to sort within the questions subarray.