1

コード:

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が初めてなので、私が試しているよりも簡単な方法があるはずです。

4

5 に答える 5

5

コードのこの部分が大部分の作業を行っているようです。

  // 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.
  }
于 2009-08-19T15:35:02.257 に答える
1

いい質問ですね。コードを再利用しないようにするためのさまざまな方法を試すだけで、間違いなく長い時間を費やすことができます。私はおそらく上記の関数の提案の1つを実行しますが、別のオプションは、コードを別の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);
于 2009-08-19T15:45:06.043 に答える
1
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 ) );
    }
}

エコーを削除し、print_r を使用しました (これらの変数が実際には配列であると仮定します)。さらに、関数内の別の場所で $tab を使用していない限り、不要でした。

編集:私は実際には print_r を使用しません...デバッグなどに役立ちます。通常、実際に表示したい配列から部分を選択し、個々の部分に echo または print を使用する方法が必要です。

EDIT2:私はこれについて賛成票と反対票の両方を得ています。問題の関数を正しい構文で書き直しました。質問の一部は非常に曖昧なので、続けます。また、情報を関数に渡すことを求めているようです。問題の $_GET['tab'] は get 変数 (yoursite.com/index.php?tab=newest) にアクセスしています。あなたが求めているように見えるのは、関数の使い方です。あなたはそれを正しく行っていました:

function organize_questions( $tab )
{
    ...
}

変数タブを使用すると仮定します。この関数を使用するには、ファイル内の別の関数、または php_require または php_include を実行する別のファイルからこの関数を呼び出します。

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

そして、以前に作成したように関数で元の $tab を使用するか、パラメーターリストで $tab を使用して上記で述べたように

于 2009-08-19T15:32:28.313 に答える
1

あなたが探しているのは戦略です....

$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

于 2009-08-19T15:51:18.353 に答える
0
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)
于 2009-08-19T16:22:54.517 に答える