2016-12-16 10 views
0

申し訳ありませんが、私は開発に新しくなりましたので、かなりの時間をかけて適切な解決策を得られませんでした。Forループの各値をグループ化し、グループ化された値に基づいて実行する方法

同じ値を持つ配列をグループ化するとします。 例として配列の総サイズは以下のように3であり、ループごとに3回実行されますが、2つの一意のclass_idしか含まれていないため、ループを2回しか実行しませんでした。

だから、私によると、出力として、私はそれとして、各のみ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

またはループオーバー配列別の配列にクラスidを入れ、ループ内にループするbreak現在の配列のclassidが 'in_array'である場合作成したclassidの新しい配列 –

答えて

0

よし2ユニークCLASS_IDが含まれています一緒にマージされた値の新しい配列を作成します。

// 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あなたの努力に感謝します。 –

関連する問題