PHP — ошибки с моими циклами

#php #loops

#php #циклы

Вопрос:

Я пытался вставить в массив разные значения из массива многомерных объектов.

Мой объект, похоже, похож на тот, что в 'Chapter' :

  object(DoctrineORMPersistentCollection)[5301]
  private 'snapshot' => 
    array (size=3)
      0 => 
        object(Video2LearnBddBundleEntityChapitre)[5335]
          private 'id' => int 1
          private 'titre' => string 'C01' (length=3)
          private 'Videos' => 
            object(DoctrineORMPersistentCollection)[5371]
              ...
      1 => 
        object(Video2LearnBddBundleEntityChapitre)[5373]
          private 'id' => int 2
          private 'titre' => string 'C02' (length=3)
          private 'Videos' => 
            object(DoctrineORMPersistentCollection)[5374]
              ...
      2 => 
        object(Video2LearnBddBundleEntityChapitre)[5376]
          private 'id' => int 3
          private 'titre' => string 'C03' (length=3)
          private 'Tutoriel' => 
          private 'Videos' => 
            object(DoctrineORMPersistentCollection)[5377]
              ...
  

и в 'Videos'

 0 => 
        object(Video2LearnBddBundleEntityVideo)[5831]
          private 'id' => int 4
          private 'titre' => string 'qzesthbvs s hgqsd' (length=17)
          private 'prix' => int 0
          private 'level' => string 'hard' (length=8)
1 => 
        object(Video2LearnBddBundleEntityVideo)[5831]
          private 'id' => int 4
          private 'titre' => string 'qzesthbvs s hgqsd' (length=17)
          private 'prix' => int 0
          private 'level' => string 'noob' (length=8)
  

Прежде чем попробовать на PHP, я сделал это на Javascript :

 var NIV = [0, 1, 2];
NIV[0] = [];
NIV[1] = [];
NIV[2] = [];
            $.each(e.tuto.Chapiter, function(idx, chapiter) {
                $.each(chapiter.Videos, function(idx, video) {
                    switch (video.level) {
                        case "noob":
                            NIV[0].push(video.level);
                            break;
                        case "medium":
                            NIV[1].push(video.level);
                            break;
                        case "hard":
                            NIV[2].push(video.level);
                            break;
                    }
                });
            });
  

Но теперь мне нужно сделать то же самое в PHP. Я пытался это сделать, но я не эксперт в PHP, и я думаю, что у меня проблема в моих циклах… Как выбрать 'Level' ?

Я сделал это :

 $NIV = [0, 1, 2];
    $NIV[0] = [];
    $NIV[1] = [];
    $NIV[2] = [];

    foreach ($chap as $section => $video) {
        foreach ($video as $niveau => $value) {
            switch ($value.niveau) {
                case "noob":
                    array_push($NIV[0], ($value.level));
                    break;
                case "medium":
                    array_push($NIV[1], ($value.level));
                    break;
                case "hard":
                    array_push($NIV[2], ($value.level));
                    break;
            }
        }
    }
  

Для информации, вот остальная часть моего кода для вычисления средневзвешенного значения всех уровней из всех видео:

     $nb_noob = sizeof($NIV[0]);
    $nb_medium = sizeof($NIV[1]);
    $nb_hard = sizeof($NIV[2]);

    $total_niv = $nb_noob   $nb_medium   $nb_hard ;

    $ratio_nb_noob  = $nb_noob / $total_niv;
    $ratio_nb_medium  = $nb_medium / $total_niv;
    $ratio_nb_hard = $nb_hard / $total_niv;

    $weighted_average= $ratio_nb_noob  * 1   $ratio_nb_medium  * 2   $ratio_nb_hard * 3;

    $weighted_average= round($weighted_average);
  

Спасибо!

Комментарии:

1. Это javascript switch ($value.niveau) то, что вы хотите, предназначено для php switch ($value['niveau'])

Ответ №1:

Я думаю, вы хотите что-то вроде этого:

 $NIV    = [0, 1, 2];
$NIV[0] = 0;
$NIV[1] = 0;
$NIV[2] = 0;

foreach ($Chapter->snapshot as $section => $row) 
{
    foreach ($row->Videos as $niveau => $video) 
    {
        switch ($video->level) 
        {
            case "noob":
                $NIV[0]  ;
                break;
            case "medium":
                $NIV[1]  ;
                break;
            case "hard":
                $NIV[2]  ;
                break;
        }
    }
}
  

Вы можете получить доступ к индексу объекта с помощью $video->level

И теперь вам не нужна size_of функция. Просто получите это с $NIV[0] тем, что возвращает count

Комментарии:

1. Здравствуйте! Это не работает, но я думаю, что это почти хороший результат 🙂 . Я редактирую свой пост, касающийся массива объектов… Это что — то меняет ?

2. @Zagloo Прежде чем обновлять ответ, что вы хотите добавить в индекс, уровень видео? идентификатор видео? Итак, что содержит $NIV массив?

3. Конечная цель этого кода — вычислить средневзвешенное значение всех уровней видео. Сейчас я вставляю остальную часть своего кода. Итак, мне просто нужно указать уровень каждого видео, подсчитать, сколько существует разных уровней, и сделать средневзвешенное значение

4. @Zagloo обновил ответ новым named variables лайком $Chapter->snapshot . Уверен, что эти переменные

5. Я не могу помочь вам таким образом. always not working Что не работает? Вы получаете какие-либо ошибки? Ты сбросил это var_dump($NIV);

Ответ №2:

Это решение 🙂

 $NIV = [0, 1, 2];
    $NIV[0] = 0;
    $NIV[1] = 0;
    $NIV[2] = 0;

    foreach ($chapter as $key => $value) {
        foreach ($value->getVideos() as $index => $val) {
            switch ($val->getLevel()) {
                case "noob":
                    $NIV[0]   ;
                    break;
                case "medium":
                    $NIV[1]   ;
                    break;
                case "hard":
                    $NIV[2]   ;
                    break;
            }
        }
    }


    $total_niv = $NIV[0]   $NIV[1]   $NIV[2];

    $ratio_nb_noob = $NIV[0] / $total_niv;
    $ratio_nb_medium = $NIV[1] / $total_niv;
    $ratio_nb_hard = $NIV[2] / $total_niv;

    $weighted_average = $ratio_nb_noob * 1   $ratio_nb_medium * 2   $ratio_nb_hard * 3;
    $weighted_average = round($weighted_average );