2012-02-07 2 views
-2

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

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

                <?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; 
                  } 
                  ?> 
              
              +0

              Я уверен, что вы можете сузить это до теста, который занимает несколько строк. –

              +0

              Определение функции 'chords' отсутствует в вашем вопросе, и похоже, что вы используете глобальные переменные в качестве параметров вызова функции. – hakre

              +0

              My Globals определяются как это в функции '$ GLOBALS ['i1']' Функция работает нормально в верхнем коде. но в нижнем коде php-переменная '$ chord_dump' не анализирует PHP – warmwhisky

              ответ

              2

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

              <?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, вызывая так называемый string-context).

              Но вместо этого я предлагаю удалить глобальные переменные и включить их в параметры. Кроме того, вы можете нормализовать каждый выходной блок в структуру данных, такую ​​как 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>'; 
              } 
              
              +0

              Тим ответил мне на это. Но ваш второй блок кода красив! Это обеспечивает большую масштабируемость! Большое спасибо Хакре. Хотя большая часть того, что вы сказали, проходит над моей головой. По крайней мере, я знаю, что делает этот код, и я могу выбрать его, чтобы понять его лучше. На комментарий параметра я действительно не знаю, что это такое. Я сам преподаю, потому что я на весь день надувателем, поэтому я выбираю и разбираю то, что могу, чтобы понять программирование. – warmwhisky

              +0

              @warmwhisky: Я бы лучше смог показать вам, что если бы вы разместили функцию «chord». Это сделало бы его гораздо более практичным и понятным, вместо того, чтобы писать более или менее абстрактные тексты. Я бы сказал, что код ниже намного лучше, и это общий способ решения проблемы, поэтому он полезен не только в этом конкретном случае, но и в более общем плане. – hakre

              +0

              Это лучше, чем я себе представлял, я хотел, чтобы он работал. Возможности создания аккордов для гитары теперь так просто! Это сделало мои проекты намного более управляемыми в моей голове и выглядят такими чистыми в редакторе кода. Я разместил функцию аккорда, если вы все еще заинтересованы в ее просмотре. Я уверен, что это не самый приятный код, который вы видели! – warmwhisky

              0

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

              Трудно сказать, не зная, что такое шнуры, но вы можете, безусловно, заменить эхо с несколькими аккордами одной петлей forDocs или foreachDocs. И вы можете превратить весь блок в функцию. Я не совсем понимаю, что такое переменные:

              <?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 
              } 
              ?> 
              
              +0

              Я боюсь, что '$ i1' -' $ i3' являются глобальными переменными (в противном случае не было бы необходимости устанавливать их в вопросе, и поэтому им не нужно быть параметром функции). Лучше, чем для foreach, если вы стремитесь к удобочитаемости, я изменю это. – hakre

              +0

              Тим ответил на это сейчас, но спасибо за ваш вклад. Вы имеете в виду, что он недействителен для того, чтобы иметь класс и идентификаторы с одинаковым именем или повторять идентификаторы chords_wrapper? – warmwhisky

              +0

              @hakre - Спасибо, ты прав насчет foreach в сочетании с array_map. Это аккуратный образец. –

              1

              Просто положите свою функцию внутри функции.

              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

              Моя проблема с этим - мне нужно обернуть каждую функцию аккордов с помощью div и тегов ul. – warmwhisky

              +0

              Отредактировано для включения этого. Вы можете выйти из php внутри функции - очень полезная черта PHP. – Tim

              +0

              @Tim - как насчет цикла for для всех этих 'chords (n)' s? –

              0

              Это настройка базовой функции 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

              Функция отлично работает, это не проблема , Простая проблема заключается в том, что я хочу распечатать вызовы функций из переменной. Код, который я разместил в верхней части. посмотрите здесь http://www.gtdb.org/tuning_links/chord_generator/chords_all.php Я просто хочу, чтобы этот код был убран таким образом, чтобы его было проще в другой группе. – warmwhisky

              +0

              Я не знаю, как это может «отлично работать», когда на вашей странице указаны ошибки. И код, который я опубликовал, показывает вам, как многократно вызывать одну и ту же функцию с одной строкой кода. – Scott

              +0

              @warmwhisky: Если вы ищете действительно хорошие предложения, вы должны добавить источник функции 'chords' к вашему вопросу. – hakre

              Смежные вопросы