Каков наилучший способ повторного использования кода в PHP? - PullRequest
1 голос
/ 19 августа 2009

Код:

if ( $_GET['tab'] == 'newest' ) { 
      // Go through each question
      foreach( array_reverse( $end_array, true ) as $tags_and_Qid['question_id'] => $titles_and_Qid['title'] )
      {   
        // Grab the title for the first array
        $title = $titles [ $tags_and_Qid['question_id'] ] ['title'];

        // Grab the tags for the question from the second array
        $tags = $end_array [ $tags_and_Qid['question_id'] ] ['tag'];

        // Grab the username for the question from the second array
        $username = $usernames [ $tags_and_Qid['question_id'] ] ['username'];
        --- cut ----                                                                                                                                                       
      }   
  }

Мне нужно часто использовать этот код. Единственное отличие - array_reverse (..., true) в первом примере.

Я попытался решить проблему, сделав функцию organize_question для решения этой проблемы. Мне не удалось:

function organize_questions ( $tab ) {
      if ( $_GET['tab'] == 'newest' ) {
        echo ( "array_reverse ( $end_array ,  true )" ); 
                                  // Problem here!
      }
      if ( $_GET['tab'] == 'oldest' ) {
          echo ( "$end_array" );    
            // this does not work
      } else {
        echo ( "array_reverse ( $end_array ,  true )" );
                                   // Problem here!
      }
  }

Затем я изменил соответствующую строку в моем коде так:

 foreach( organize_question( $tab ) as $tags_and_Qid['question_id'] => $titles_and_Qid['title'] )

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

Я новичок в PHP, поэтому должен быть более простой способ сделать это, чем то, что я пытаюсь.

Ответы [ 5 ]

5 голосов
/ 19 августа 2009

Похоже, что эта часть вашего кода выполняет основную часть работы:

  // Go through each question
  foreach( array_reverse( $end_array, true ) as $tags_and_Qid['question_id'] => $titles_and_Qid['title'] )
  {   
          -- cut ---
  }

Я бы отделил проверку $_GET['tab'] от вашей organize_questions() функции и принял бы решение о параметрах в другом месте. Как это:

function organize_questions($array)
{
    foreach($array as $questionId => $title )
      {   
            //do the work
      }   
}

А затем основывайте свой код принятия решений в другом месте:

  if ( $_GET['tab'] == 'newest' )
  {
    organize_questions(array_reverse ( $end_array ,  true ));
  }
  else if ( $_GET['tab'] == 'oldest' )
  {
      organize_questions($end_array);
  } 
   else
  {
     //etc.
  }
1 голос
/ 19 августа 2009

То, что вы ищете, это стратегия ....

$strategies = array(
  'oldest' => create_function(
      '$questions', 
      'return organize_questions($questions);'
  ),
  'hottest' => create_function(
      '$questions', 
      'return organize_questions(sort_by_hottness($questions));'
  ),
  'default' => create_function(
      '$questions', 
      'return organize_questions(array_reverse($questions, true));'
  ),
);

$strategy = 'default';

if (array_key_exists($strategies, $_GET['tab'])
    $strategy = $_GET['tab'];

print_r( $strategies[$strategy]($questions) );

Вы в основном говорите, что у вас есть такие вещи (вопросы), с которыми вы хотите что-то сделать (отсортировать их).

Вы также можете посмотреть на функцию usort, http://www.php.net/manual/en/function.usort.php

1 голос
/ 19 августа 2009

Хороший вопрос. Вы определенно можете потратить много времени, просто пытаясь использовать различные способы, чтобы удержать себя от повторного использования кода. Я бы, вероятно, сделал одно из предложенных функций, как указано выше, но другой вариант - поместить код в отдельный файл PHP, а затем включить его в нужное место. Это в основном становится эквивалентом встроенной функции в других языках, и если вы беспокоитесь о скорости выполнения, это хороший способ. В большинстве случаев, однако, вы будете больше беспокоиться о размере страницы, которую вы отправляете клиенту по http, поэтому это будет не так приемлемо, как написание функции. Я в основном подчеркиваю, что в каждой ситуации есть свое «лучшее» решение - в вашем случае я бы сказал, что ответ МакАдена - хороший.

Использование включает в себя:

//myscript.php
if ( $_GET['tab'] == 'newest' ) 
{
    print_r( array_reverse( $end_array ,  true ) ); 
}
else if ( $_GET['tab'] == 'oldest' ) 
{
    print_r($end_array);    
} 
else 
{
    print_r(array_reverse ( $end_array ,  true ) );
}

А потом в вашем коде позже:

//myexecutionplace.php
$end_array = foo;
include 'myscript.php';
doStuffWith($end_array);
$end_array = foo2;
include 'myscript.php';
doStuffWith($end_array2);
1 голос
/ 19 августа 2009
function organize_questions () 
{
    if ( $_GET['tab'] == 'newest' ) 
    {
        print_r( array_reverse( $end_array ,  true ) ); 
    }
    else if ( $_GET['tab'] == 'oldest' ) 
    {
        print_r($end_array);    
    } 
    else 
    {
        print_r(array_reverse ( $end_array ,  true ) );
    }
}

Я удалил echos и использовал print_r (предполагая, что эти переменные на самом деле были массивами). Кроме того, если вы не используете $ tab где-то еще в функции, она не нужна.

РЕДАКТИРОВАТЬ: Я бы на самом деле не использовал print_r ... это полезно для отладки и тому подобное. Обычно вам нужен какой-то способ выбрать фрагменты из массива, которые вы хотите отобразить, и использовать эхо или печать для отдельных фрагментов.

РЕДАКТИРОВАТЬ 2: Я получаю как за, так и против за это. Переписана рассматриваемая функция с правильным синтаксисом. Части вопроса очень расплывчаты, поэтому я продолжу. Похоже, вы также просите передать информацию в функции. рассматриваемый $ _GET ['tab'] обращается к переменным get (yoursite.com/index.php?tab=newest). Похоже, вы спрашиваете, как вообще использовать функции. Вы правильно сделали с:

function organize_questions( $tab )
{
    ...
}

Предполагая, что вы собираетесь использовать вкладку переменных. Чтобы использовать эту функцию, вы должны вызывать ее как таковую из другой функции в файле или из другого файла, который выполняет php_require или php_include:

$mytab = 'bob';
organize_questions( $mytab);

И тогда вы бы использовали исходную $ tab в функции, как вы ее создали ранее или, как я уже говорил выше, с $ tab в списке параметров

0 голосов
/ 19 августа 2009
function sortArray($direction, $array)
{
    switch ($direction) { 
        case 'oldest':
            return array_reverse($array, true);
        case 'newest':
            return $array;
        default:
            return array(); 
    }
}

function processQuestions($array)
{
    foreach($array as $tags_and_Qid['question_id'] => $titles_and_Qid['title'] ) {   
        //code
    } 
}

$sortedArray = sortArray($tab, $end_array);
processQuestions($sortedArray);

И вам, вероятно, следует переписать следующее.

foreach($array as $tags_and_Qid['question_id'] => $titles_and_Qid['title'] )
//could be rewritten as 
foreach($array as $question_id => $title)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...