#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)
то, что вы хотите, предназначено для phpswitch ($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 );