За последние 24 часа нас посетили 35487 программистов и 1577 роботов. Сейчас ищут 1113 программистов ...

Оптимизировать участок кода

Тема в разделе "Вопросы от блондинок", создана пользователем html-программист, 18 июн 2015.

  1. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Есть вот такой массив, пока он заполняется рандомом:
    Код (PHP):
    1. for($i=0; $i<100; $i++){
    2.     $arr[$i][0]=rand(0,127); //нота
    3.     $arr[$i][1]=rand(0,127); //громкость
    4.     $arr[$i][2]=rand(1,4); //продолжительность
    5. }
    Есть вот такой код:
    Код (PHP):
    1. $txt = "MFile 0 1 48
    2. MTrk
    3. 0 Meta Text \"Genetic algorithm\"
    4. 0 PrCh ch=1 p=0\n";
    5. $tmptxt="";
    6. for($i=0;$i<100;$i++){
    7.     $on=$i*10;
    8.     $tmptxt=$tmptxt.$on." On ch=1 n=".$arr[$i][0]." v=".$arr[$i][1]."\n";
    9. }
    10. $txt=$txt.$tmptxt."1050 Meta TrkEnd
    11. TrkEnd";
    который на выходе создает вот такое:
    Код (PHP):
    1. MFile 0 1 48
    2. MTrk
    3. 0 Meta Text "Genetic algorithm"
    4. 0 PrCh ch=1 p=0
    5. 0 On ch=1 n=4 v=103
    6. 10 On ch=1 n=64 v=79
    7. 20 On ch=1 n=48 v=77
    8. 30 On ch=1 n=112 v=64
    9. 40 On ch=1 n=108 v=55
    10. 50 On ch=1 n=82 v=21
    11. ...
    12. 990 On ch=1 n=55 v=46
    13. 1050 Meta TrkEnd
    14. TrkEnd
    Дальше надо подключить эту штуковину: $arr[$i][2]=rand(1,4)
    Если сделать как-то так:
    Код (PHP):
    1.     $tmptxt=$tmptxt.$on." On ch=1 n=".$arr[$i][0]." v=".$arr[$i][1]."\n";
    2.     $off=$on+$arr[$i][2]*10;
    3.     $tmptxt=$tmptxt.$off." Off ch=1 n=".$arr[$i][0]." v=0\n";
    получается вот так:
    Код (PHP):
    1. 0 On ch=1 n=80 v=113
    2. 20 Off ch=1 n=80 v=0
    3. 10 On ch=1 n=1 v=75
    4. 30 Off ch=1 n=1 v=0
    5. 20 On ch=1 n=7 v=58
    6. 30 Off ch=1 n=7 v=0
    7. 30 On ch=1 n=90 v=75
    8. 50 Off ch=1 n=90 v=0
    9. 40 On ch=1 n=117 v=108
    10. 60 Off ch=1 n=117 v=0
    Ну, понятно, что оно всё не по порядку и чудо-юдо класс "PHP MIDI CLASS" не понимает, что от него хотят.
    Сделал костыль:
    Код (PHP):
    1. $txt = "MFile 0 1 48
    2. MTrk
    3. 0 Meta Text \"Genetic algorithm\"
    4. 0 PrCh ch=1 p=0\n";
    5. $tmptxt="";
    6. for($i=0;$i<100;$i++){
    7.     $on=$i*10;
    8.     $off=$on+$arr[$i][2]*10;
    9.     if(isset($offarr[$off])){
    10.         $offarr[$off][count($offarr[$off])]=$arr[$i][0];
    11.     }else{
    12.         $offarr[$off][0]=$arr[$i][0];
    13.     }
    14.     if(isset($offarr[$on])){
    15.         $jcount=count($offarr[$on]);
    16.         for($j=0;$j<$jcount;$j++){
    17.             $tmptxt=$tmptxt.$on." Off ch=1 n=".$offarr[$on][$j]." v=0\n";
    18.         }
    19.     }
    20.     $tmptxt=$tmptxt.$on." On ch=1 n=".$arr[$i][0]." v=".$arr[$i][1]."\n";
    21. }
    22. $txt=$txt.$tmptxt."1050 Meta TrkEnd
    23. TrkEnd";
    На выходе норм:
    Код (PHP):
    1. MFile 0 1 48
    2. MTrk
    3. 0 Meta Text "Genetic algorithm"
    4. 0 PrCh ch=1 p=0
    5. 0 On ch=1 n=104 v=110   (off=30)
    6. 10 On ch=1 n=96 v=74   (off=20)
    7. 20 Off ch=1 n=96 v=0
    8. 20 On ch=1 n=39 v=115   (off=40)
    9. 30 Off ch=1 n=104 v=0
    10. 30 On ch=1 n=40 v=27   (off=70)
    11. 40 Off ch=1 n=39 v=0
    12. 40 On ch=1 n=34 v=65   (off=60)
    13. 50 On ch=1 n=32 v=17   (off=90)
    14. 60 Off ch=1 n=34 v=0
    15. 60 On ch=1 n=112 v=18   (off=70)
    16. 70 Off ch=1 n=40 v=0
    17. 70 Off ch=1 n=112 v=0
    18. 70 On ch=1 n=71 v=8   (off=80)
    19. 80 Off ch=1 n=71 v=0
    20. 80 On ch=1 n=0 v=76   (off=100)
    21. 90 Off ch=1 n=32 v=0
    22. ...
    23. 1050 Meta TrkEnd
    24. TrkEnd
    И все работает, но выглядит чудовищно - в цикле вызывается еще один цикл, в котором вызывается функция count. Как бы его так оптимизировать?
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Оно работает? Если да, оставь как есть.
     
  3. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    если я правильно понял задачу
    Код (PHP):
    1. $txt = "MFile 0 1 48\nMTrk
    2. 0 Meta Text \"Genetic algorithm\"
    3. 0 PrCh ch=1 p=0\n";
    4. $tmptxt="";
    5. $offs=[];
    6. for($i=0; $i<100; ++$i) {
    7.   $on=$i*10;
    8.   $tmptxt .= $on." On ch=1 n=".$arr[$i][0]." v=".$arr[$i][1].' ('.$arr[$i][2].")\n";
    9.   $off = $on + $arr[$i][2]*10;
    10.   $offs[$off][] = $arr[$i][0];
    11.   if (isset($offs[$on])) {
    12.     foreach($offs[$on] as $k=>$note_off) {
    13.       $tmptxt .= $on.' Off ch=1 n='.$note_off.' v=0'."\n";
    14.     }//foreach
    15.     unset($offs[$on]);
    16.   }
    17. }
    18. $txt .= $tmptxt."1050 Meta TrkEnd\nTrkEnd"; 
     
  4. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    о_О
     
  5. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    можно заменить на $offs=array();
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    js-style объявления массивов. В модерновом пыхе и так можно, да.
     
  7. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    подходит мой вариант или нет?
    мне интересно просто, правильно я понял структуру или нет?
     
  8. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    В общем-то да.