PHP эхо / печать вызова функции, которая находится внутри переменной - PullRequest
0 голосов
/ 08 февраля 2012

Как бы я мог поместить вызовы функций в переменную, а затем повторить или распечатать их несколько раз?

В настоящее время у меня есть этот код, который 24 раза вызывает функцию PHP "chords".Функции разбиты на группы по шесть человек, поэтому я хотел бы сжать эти шесть.Я хотел бы увеличить это, хотя только когда у меня есть код, выглядящий более хорошим и работающим более эффективно.

                          <?php 
                              $chord_name = 'A 7';
                              $i1 = '4';
                              $i2 = '7';
                              $i3 = '10';
                          ?>
                              <div id="chords_wrapper" class="chords_wrapper">
                                  <? echo $fretnumbers; ?>
                                  <h1><? echo $chord_name; ?></h1>
                                  <ul><?php chords (6); ?></ul>
                                  <ul><?php chords (5); ?></ul>
                                  <ul><?php chords (4); ?></ul>
                                  <ul><?php chords (3); ?></ul>
                                  <ul><?php chords (2); ?></ul>
                                  <ul><?php chords (1); ?></ul>
                              </div>
              
              
                          <?php 
                              $chord_name = 'A Minor';
                              $i1 = '3';
                              $i2 = '7';
                              $i3 = '0';
                          ?>
                              <div id="chords_wrapper" class="chords_wrapper">
                                  <? echo $fretnumbers; ?>
                                  <h1><? echo $chord_name; ?></h1>
                                  <ul><?php chords (6); ?></ul>
                                  <ul><?php chords (5); ?></ul>
                                  <ul><?php chords (4); ?></ul>
                                  <ul><?php chords (3); ?></ul>
                                  <ul><?php chords (2); ?></ul>
                                  <ul><?php chords (1); ?></ul>
                              </div>
              
              
                          <?php 
                              $chord_name = 'A Minor 7';
                              $i1 = '3';
                              $i2 = '7';
                              $i3 = '10';
                          ?>
                              <div id="chords_wrapper" class="chords_wrapper">
                                  <? echo $fretnumbers; ?>
                                  <h1><? echo $chord_name; ?></h1>
                                  <ul><?php chords (6); ?></ul>
                                  <ul><?php chords (5); ?></ul>
                                  <ul><?php chords (4); ?></ul>
                                  <ul><?php chords (3); ?></ul>
                                  <ul><?php chords (2); ?></ul>
                                  <ul><?php chords (1); ?></ul>
                              </div>
              
              
                      <div style="width:620px; text-align:center; clear:both;">
              
                      </div>
              
              
                  </div>
              

              Мне бы хотелось, чтобы это выглядело примерно так, чтобы каждая группа функций была видна более легко и аккуратно.Я пробовал это, но он отображает код php, не выполняя его.

              <?php
                  $kn = '25';
                  $chord_dump = '<div id="chords_wrapper" class="chords_wrapper">
                          <? echo $fretnumbers; ?>
                          <h1>'.$chord_name.'</h1>
                          <ul><?php chords (6); ?></ul>
                          <ul><?php chords (5); ?></ul>
                          <ul><?php chords (4); ?></ul>
                          <ul><?php chords (3); ?></ul>
                          <ul><?php chords (2); ?></ul>
                          <ul><?php chords (1); ?></ul>
                      </div>';
                  ?>
                  <div id="chords_set">
                          <?php 
                      // A Major
                              $i1 = '4';
                              $i2 = '7';
                              $i3 = '0';
                              $chord_name = 'A Major';
                              echo $chord_dump;
              
              
                      // A 7
              
                              $i1 = '4';
                              $i2 = '7';
                              $i3 = '10';
                              $chord_name = 'A 7';
                              echo $chord_dump;
              
              
                      // A Minor
              
                              $i1 = '3';
                              $i2 = '7';
                              $i3 = '0';
                              $chord_name = 'A Minor';
                              echo $chord_dump;
              
              
                      // A Minor 7
              
                              $i1 = '3';
                              $i2 = '7';
                              $i3 = '10';
                              $chord_name = 'A Minor 7';
                              echo $chord_dump;
                          ?>
              
              
                      <div style="width:620px; text-align:center; clear:both;">
              
                      </div>
              
              
                  </div>   
              

              Функция аккорда

                  <? 
              
              
              
                  function chords ($funtion_string) {
                      /*$chrd_tn ="CGCFCE";
                      $tuning_capo =0;*/
                      $chrd_tn = $GLOBALS['chrd_tn'];
                      $tuning_capo = $GLOBALS['tuning_capo'];
                      $notes_array = '';
                      // Select Chord Key Notes
                      $result = mysql_query("SELECT * FROM `guitar_tunings_chords` WHERE note_id - ".$GLOBALS['kn']." >= 0 AND ( (( note_id - ".$GLOBALS['kn'].") % 12 ) = ".$GLOBALS['i1']." OR ( (note_id-".$GLOBALS['kn'].") % 12 ) = ".$GLOBALS['i2']." OR ( (note_id-".$GLOBALS['kn'].") % 12 ) = ".$GLOBALS['i3']." OR ( note_id - ".$GLOBALS['kn'].") % 12 = 0) LIMIT 24") or die(mysql_error());
                      while ( $row = mysql_fetch_array($result) ) {
                      $notes2 = $row["note"]; 
                      $notes2 = str_replace("#", "z", $notes2);
                      $notes_array = ''.$notes2.','.$notes_array.'';
                      }
              
                          // Delete comma from end of chord notes array
                          $notes_array = substr($notes_array,0,-1);
              
                      // Counter to distinguish the nut from the fretboard
                      $counter = 0;
                      $result2 = mysql_query("SELECT * 
                  FROM `guitar_tunings_links`
                  JOIN guitar_tunings_chords ON guitar_tunings_links.".$funtion_string." = guitar_tunings_chords.note
                  WHERE tuning =  '".$chrd_tn."'") or die(mysql_error()); 
                      while ( $row = mysql_fetch_array($result2) ) {
                          $bridge_note = ($row["note_id"]);           
                      }/*
                      ?><BR>$chrd_tn  = <? var_dump ($chrd_tn); 
                      ?><BR>$tuning_capo  = <? var_dump ($tuning_capo);
                      ?><BR>$funtion_string  = <? var_dump ($funtion_string);  
                      ?><BR>$key_note  = <? var_dump ($key_note); 
                      ?><BR>$bridge_note  = <? var_dump ($bridge_note); 
                      ?><BR><?*/
              
                          // SELECT * FROM `guitar_tunings_chords` WHERE `note_id` >= 28 LIMIT 0,8
                      $result4 = mysql_query("SELECT * FROM `guitar_tunings_chords` WHERE `note_id` >= $bridge_note LIMIT $tuning_capo,8") or die(mysql_error());
                      while ( $row = mysql_fetch_array($result4) ) {
              
                          //Notes
                          $note = ($row["note"]); 
              
                          // Replace # with z
                          $note = str_replace("#", "z", $note);
              
                          // Distinguish nut notes on or off
                          if (preg_match("/\b".$note."\b/i", $notes_array)) {
                              $n_nut_style = 'note_nut_on';
                          } else { $n_nut_style = 'note_nut_off'; 
                          }
              
                          // Distinguish fretboard notes on or off
                          if (preg_match("/\b".$note."\b/i", $notes_array)) {
                              $n_style = 'note_on';
                          } else { $n_style = 'note_off'; 
                          }
              
                          // Print nut notes
                          if ($counter < 1) {
                              $str_prtou = '<li class="'.$n_nut_style.'">'.$note.'</li>';
                              $numbers = array("0", "1", "2", "3", "4", "5", "6", "7", "8");
                              $str_prtou = str_replace($numbers, "", $str_prtou);
                          }
              
                          // Print fretboard notes
                          if ($counter > 0)       
                          $str_prtou = ''.$str_prtou.'<li class="'.$n_style.'">'.$note.'</li>
                          ';
                          $counter++;
                      }
                      $str_prtou = str_replace("z", "#", $str_prtou);
                      $numbers = array("0", "1", "2", "3", "4", "5", "6", "7", "8");
                      $str_prtou = str_replace($numbers, "", $str_prtou);
                      echo $str_prtou;
                  }
                  ?>
              

              Ответы [ 4 ]

              3 голосов
              / 08 февраля 2012

              Это может быть решением, но это плохой стиль:

              <?php
                  $kn = '25';
                  class chord_dump {
                      public function __toString() {
                          global $fretnumbers, $chord_name;
                          return '<div id="chords_wrapper" class="chords_wrapper">
                          '.$fretnumbers.'
                          <h1>'.$chord_name.'</h1>
                          <ul>'.chords(6).'</ul>
                          <ul>'.chords(5).'</ul>
                          <ul>'.chords(4).'</ul>
                          <ul>'.chords(3).'</ul>
                          <ul>'.chords(2).'</ul>
                          <ul>'.chords(1).'</ul>
                      </div>';
                      }
                  }
                  $chord_dump = new chord_dump;
                  ?>
              

              Затем вы можете echo переменную $chord_dump, и она всегда будет выполнять функцию __toStringкласса cord_dump тогда:

              <div id="chords_set">
                      <?php 
                  // A Major
                          $i1 = '4';
                          $i2 = '7';
                          $i3 = '0';
                          $chord_name = 'A Major';
                          echo $chord_dump;
              
              
                  // A 7
              
                          $i1 = '4';
                          $i2 = '7';
                          $i3 = '10';
                          $chord_name = 'A 7';
                          echo $chord_dump;
              
              
                  // A Minor
              
                          $i1 = '3';
                          $i2 = '7';
                          $i3 = '0';
                          $chord_name = 'A Minor';
                          echo $chord_dump;
              
              
                  // A Minor 7
              
                          $i1 = '3';
                          $i2 = '7';
                          $i3 = '10';
                          $chord_name = 'A Minor 7';
                          echo $chord_dump;
                      ?>
              
              
                  <div style="width:620px; text-align:center; clear:both;">
              
                  </div>
              
              
              </div>   
              

              Это делается PHP, когда он преобразует объект в строку (поскольку переменная используется с echo, вызывая так называемый строковый контекст).

              Но вместо этого я предлагаю вам удалить глобальные переменные и превратить их в параметры.Кроме того, вы можете нормализовать каждый выходной блок в структуру данных, такую ​​как Array или stdClass, обернуть их в массив, выполнить итерацию по этому массиву и создать выходные данные.После этого вы можете легко расширить как то, что делает ваша программа, так и вывод.

              /* model */
              $kn = '25';
              $chords = array(        
                  array(4, 7, 0, 'A Major'),
                  array(4, 7, 10, 'A 7'),
                  ...
              );
              
              /* output */
              foreach ($chords as $chord_index => $chord)
              {
                  list($i1, $i2, $i3, $chord_name) = $chord;
              
                  echo '<div id="chord_', $chord_index, '" class="chords_wrapper">'
                        , $fretnumbers, '<h1>', $chord_name, '</h1>';
                  foreach (range(6,1) as $i)
                  {
                      echo '<ul>', chords($i), '</ul>';
                  }
                  echo '</div>';
              }
              
              1 голос
              / 08 февраля 2012

              Просто поместите вашу функцию внутри функции.

              function allChords(){
                ?>
                <div id="chords_wrapper" class="chords_wrapper">
                  <? echo $fretnumbers; ?>
                  <h1><? echo $chord_name; ?></h1>
                  <ul><?php chords (6); ?></ul>
                  <ul><?php chords (5); ?></ul>
                  <ul><?php chords (4); ?></ul>
                  <ul><?php chords (3); ?></ul>
                  <ul><?php chords (2); ?></ul>
                  <ul><?php chords (1); ?></ul>
                </div>
                <?php
              }
              

              Затем, каждый раз, когда вы хотите, чтобы они все вызывались, вы просто вызываете allChords().

              Кроме того, для вашего chordDumpстрока, вместо того, чтобы помещать теги <?php ?> внутри других тегов <?php ?>, вы просто используете оператор . для добавления:

              $chord_dump = '<div id="chords_wrapper" class="chords_wrapper">
                      <? echo $fretnumbers; ?>
                      <h1>' . $chord_name . '</h1>
                      <ul>' . chords (6) . '</ul>
                      <ul>' . chords (5) . '</ul>
                      <ul>' . chords (4) . '</ul>
                      <ul>' . chords (3) . '</ul>
                      <ul>' . chords (2) . '</ul>
                      <ul>' . chords (1) . '</ul>
                  </div>';
              

              Однако, чтобы это работало, ваша функция chords требует возвращает значение вместо , печатая его, как это, кажется, происходит сейчас.Если ваша функция имеет для ее печати, и другой опции нет, вы можете использовать буферизацию вывода для захвата результата, хотя она, вероятно, более продвинута, чем вам нужно для этой задачи.

              0 голосов
              / 08 февраля 2012

              Это настройка для базовой функции php. Однако, исходя из вашего опубликованного кода, совершенно неясно, где установлена ​​переменная $fretnumbers или что вы пытаетесь достичь с помощью переменных &i и оператора chord (*).

              <?php
                  $kn = '25';
                  echo '<div id="chords_set">';
              
                      // A Major
                      $i1 = '4';
                      $i2 = '7';
                      $i3 = '0';
                      chord_dump('fretnumbershere', 'A Major');
              
              
                      // A 7
                      $i1 = '4';
                      $i2 = '7';
                      $i3 = '10';
                      chord_dump('fretnumbershere', 'A 7');
              
              
                      // A Minor
                      $i1 = '3';
                      $i2 = '7';
                      $i3 = '0';
                      chord_dump('fretnumbershere','A Minor');
              
              
                      // A Minor 7
                      $i1 = '3';
                      $i2 = '7';
                      $i3 = '10';
                      chord_dump('fretnumbershere','A Minor 7');
              
              
              
                      echo '<div style="width:620px; text-align:center; clear:both;">
              
                      </div>
              
              
                  </div>';
              
              function chord_dump($fretnumbers, $chord_name) {
               $chords= '<div id="chords_wrapper" class="chords_wrapper">.'
                      $fretnumbers.'
                      <h1>'.$chord_name.'</h1>
                      <ul>'.chords (6).'</ul>
                          <ul>'.chords (5).'</ul>
                          <ul>'.chords (4).'</ul>
                          <ul>'.chords (3).'</ul>
                          <ul>'.chords (2).'</ul>
                          <ul>'.chords (1).'</ul>
                      </div>';
              
                  echo chords;
                  }
              
              ?>
              
              0 голосов
              / 08 февраля 2012

              У вас есть несколько идентификаторов с одинаковым именем chords_wrapper! Это не верно. Может быть, вы можете объединить что-то в конец идентификатора для дифференциации.

              Трудно сказать, не зная, что такое шнуры, но вы определенно можете заменить эхо нескольких аккордов одним for Документами или foreach Документы петля. И вы могли бы сделать весь блок в функцию. Мне не совсем понятно, что касается переменных, но что-то вроде этого:

              <?php
              // $instance is a number / string you can pass in to differentiate your id
              // not really sure what you're up to w $i1, $i2, and $i3
              function makeCord($chord_name, $i1, $i2, $i3, $fretnumbers, $instance)
              {
                  $GLOBALS['i1'] = $i1;
                  $GLOBALS['i2'] = $i2;
                  $GLOBALS['i3'] = $i3;
              
                  $chords = array_map('chords', range(6,1));
              
                  ?>
                  <div id="chords_wrapper<?php echo $instance; ?>" class="chords_wrapper">
                      <?php 
                      echo $fretnumbers;
                      echo "<h1>$chord_name</h1>";            
                      foreach ($chords as $chord)  
                      {
                          echo "<ul>$chord</ul>";
                      }
                      ?>
                   </div>
                   <?php
              }
              ?>
              
              ...