2016-12-16 1 views
0

죄송합니다. 그러나 나는 개발 초기이므로 많은 시간 후에 적절한 해결책을 얻지 못했습니다.For Each 루프 값을 그룹화하고 그룹화 된 값을 기반으로 실행

동일한 값을 가진 배열을 그룹화하고 싶습니다. 예를 들어, 배열의 총 크기는 아래 주어진 3이며 각 루프에 대해 3 번 실행되지만 루프가 두 번만 고유 한 class_id 만 포함되어 있으므로 두 번 실행하고 싶습니다.

그래서 나에 따르면 출력으로 나는 독특한 2를 포함로 CLASS_ID 각 단지 2 번

array(3) { 
    [0]=> 
    array(2) { 
    ["subject_id"]=> 
    string(1) "4" 
    ["class_id"]=> 
    string(1) "1" 
    } 
    [1]=> 
    array(2) { 
    ["subject_id"]=> 
    string(1) "5" 
    ["class_id"]=> 
    string(1) "1" 
    } 
    [2]=> 
    array(2) { 
    ["subject_id"]=> 
    string(1) "7" 
    ["class_id"]=> 
    string(1) "2" 
    } 
} 

PHP 코드

function view_class() 
{ 
    global $conn; 
    global $email; 
    global $sub_cls; 
    global $school_id; 
    foreach($sub_cls as $index => $record) 
    { 
     var_dump($sub_cls); 
     $class_id = $record['class_id']; 
     $subject_id = $record['subject_id']; 
     //echo "<script>alert($class_id)</script>"; 
     $run = mysqli_query($conn,"select * from class where class_id = ".$class_id." group by $class_id"); 
     while($row = mysqli_fetch_array($run)) 
     { 
      $class_id = $row['class_id']; 
      $class_name = $row['class_name']; 
      echo "<option value='$class_id'>$class_name</option>"; 
     } 
    } 
} 
+0

배열을 반복하고 다른 배열에'class_id '를 넣은 다음'array_unique'를 호출하여 중복을 제거하십시오. – Barmar

+0

건너 뛰는 요소의'subject_id '로 무엇을하고 싶습니까? – Barmar

+0

또는 loop over array 다른 클래스에 클래스 id를 넣고 loop 내부에 반복 breaking 만약 현재 배열의 classid가'in_array'라면 여러분이 만든 classid의 새로운 배열 –

답변

0

좋아을 실행하려면, 그래서 가장 쉬운 방법은 함께 새 값 배열을 병합합니다.

// Your original array 
$lessons = [ 
    [ 
     'subject_id' => "4", 
     'class_id' => "1", 
    ], 
    [ 
     'subject_id' => "5", 
     'class_id' => "1", 
    ], 
    [ 
     'subject_id' => "7", 
     'class_id' => "2", 
    ], 
]; 

// The new array 
$merged = []; 

// Loop through original array 
foreach ($lessons as $lesson) { 

    // Store some values for easier usage 
    $classId = $lesson['class_id']; 
    $subjectId = $lesson['subject_id']; 

    // If class not in the merged set, initialize it 
    if (! isset($merged[$classId])) { 
     $merged[$classId] = [ 
      'class_id' => $classId, 
      'subject_id' => [], 
     ]; 
    } 

    // Add subject in array under the class 
    $merged[$classId]['subject_id'][] = $subjectId; 

} 

출력은 다음과 같습니다

array (size=2) 
    1 => 
    array (size=2) 
     'class_id' => string '1' (length=1) 
     'subject_id' => 
     array (size=2) 
      0 => string '4' (length=1) 
      1 => string '5' (length=1) 
    2 => 
    array (size=2) 
     'class_id' => string '2' (length=1) 
     'subject_id' => 
     array (size=1) 
      0 => string '7' (length=1) 
+0

고마워요 개념적으로 단순하고 명확하게 작동합니다. 좋아요. –

0

이미 처리 한 어떤 클래스 ID를 추적하기 위해 다른 배열을 사용합니다.

$classes_processed = array(); 
foreach ($sub_cls as $index => $record) { 
    $class_id = $record['class_id']; 
    if (isset($classes_processed[$class_id]) { 
     continue; 
    } 
    $classes_processed[$class_id] = true; 
    $subject_id = $record['subject_id']; 
    $run = mysqli_query($conn,"select class_name from class where class_id = ".$class_id." limit 1"); 
    $row = mysqli_fetch_assoc($run); 
    $class_name = $row['class_name']; 
    echo "<option value='$class_id'>$class_name</option>"; 
} 

루프에서 수행하는 대신 모든 클래스 이름을 한 번에 가져 오는 쿼리 만 수행하면됩니다.

$class_ids = array_column($sub_cls, 'class_id'); 
$run = mysqli_query($conn, "select class_id, class_name from class where class_id in (" . implode(',', $class_ids) . ")"); 
while ($row = mysqli_fetch_assoc($run)) { 
    $class_id = $row['class_id']; 
    $class_name = $row['class_name']; 
    echo "<option value='$class_id'>$class_name</option>"; 
} 
+0

Ohh man 위대한 접근법 또한 최고의 하나, 완벽하게 내가 예상대로. @Barmar 당신의 노력에 감사드립니다. –

관련 문제