8

多くのフライトに関する情報を含む配列があります。5 つの最低価格のみが必要です。

最初に、価格で配列をソートするループを作成します。

次に、最初の 5 つの配列を出力します

しかし、もっと時間がかかります..どうすればこの時間を短縮できますか?

foreach ($flights_result->json_data['response']['itineraries'] as $key => $value)
{
    $mid[$key] = $value['price']['totalAmount'];
}

//Sort the data with mid descending
//Add $data as the last parameter, to sort by the common key
array_multisort($mid, SORT_ASC, $flights_result->json_data['response']['itineraries']);

// print 5 arrays
foreach ($flights_result->json_data['response']['itineraries'] as  $value)
{
    echo 'departureTime:' . $value['inboundInfo']['departureTime'] . '</br>';
    echo 'layoverInMin:' . $value['inboundInfo']['layoverInMin'] . '</br>';
    //      // loop echo 

    foreach ($value['inboundInfo']['flightNumbers'] as $flightNumbers)
    {
        echo 'flightNumbers  :' . $flightNumbers . '</br>';
    }

    echo 'durationInMin:' . $value['inboundInfo']['durationInMin'] . '</br>';
    echo 'localDepartureTimeStr:' . $value['inboundInfo']['localDepartureTimeStr'] . '</br>';
    echo ' arrivalTime:' . $value['inboundInfo']['arrivalTime'] . '</br>';
    echo ' numStops:' . $value['inboundInfo']['numStops'] . '</br>';

    ////     loop 
    foreach ($value[' inboundInfo']['flightClasses'] as $flightClasses)
    {
        echo 'flightClasses name :' . $flightClasses['name'] . '</br>';
        echo 'flightClasses fareClass :' . $flightClasses['fareClass'] . '</br>';
    }

    echo 'localArrivalTimeStr:' . $value['inboundInfo']['localArrivalTimeStr'] . '</br>';
    //      loop  echo

    foreach ($value[' carrier'] as $carrier)
    {
        echo 'carrier name :' . $carrier['name'] . '</br>';
        echo 'carrier code :' . $carrier['code'] . '</br>';
    }

    echo 'amount:' . $value['price']['amount'] . '</br>';
    echo ' totalAmount :' . $value['price']['totalAmount'] . '</br>';
    echo 'pricePerPassenger:' . $value['price']['pricePerPassenger'] . '</br>';
    echo 'currencyCode: ' . $value['price']['currencyCode'] . '</br>';
    echo 'totalPricePerPassenger: ' . $value['price']['totalPricePerPassenger'] . '</br>';
    echo 'includesTax: ' . $value['price ']['includesTax'] . '</br>';
    echo 'destinationCountryCode:' . $value[' destinationCountryCode'] . ' </br> -------- </br>';

    $count++;
    if ($count > 2)
    {
        break;
    }
}

配列の例

Array
(
    [0] => Array
        (
            [ecpcRank] => 0
            [inboundInfo] => Array
                (
                    [aircraftTypes] => Array
                        (
                        )

                    [departureTime] => 1381448400000
                    [layoverInMin] => 1359
                    [flightNumbers] => Array
                        (
                            [0] => DL3672
                            [1] => EK204
                            [2] => EK923
                        )

                    [durationInMin] => 2360
                    [airportsExpanded] => Array
                        (
                            [0] => PHL
                            [1] => JFK
                            [2] => JFK
                            [3] => DXB
                            [4] => DXB
                            [5] => CAI
                        )

                    [localDepartureTimeStr] => 2013/10/10 18:40 -0500
                    [airports] => Array
                        (
                            [0] => PHL
                            [1] => JFK
                            [2] => DXB
                            [3] => CAI
                        )

                    [arrivalTime] => 1381590000000
                    [numStops] => 2
                    [flightClasses] => Array
                        (
                            [0] => Array
                                (
                                    [name] => Economy
                                    [fareClass] => 1
                                )

                            [1] => Array
                                (
                                    [name] => Economy
                                    [fareClass] => 1
                                )

                            [2] => Array
                                (
                                    [name] => Economy
                                    [fareClass] => 1
                                )

                        )

                    [localArrivalTimeStr] => 2013/10/12 17:00 +0200
                )

            [location] => Array
                (
                    [0] => Array
                        (
                            [code] => CAI
                            [name] => Cairo
                        )

                    [1] => Array
                        (
                            [code] => DXB
                            [name] => Dubai
                        )

                    [2] => Array
                        (
                            [code] => PHL
                            [name] => Philadelphia
                        )

                    [3] => Array
                        (
                            [code] => JFK
                            [name] => New York J F Kennedy
                        )

                    [4] => Array
                        (
                            [code] => MXP
                            [name] => Milan Malpensa
                        )

                )

            [carrier] => Array
                (
                    [0] => Array
                        (
                            [name] => Delta Air Lines
                            [code] => DL
                        )

                    [1] => Array
                        (
                            [name] => US Airways
                            [code] => US
                        )

                    [2] => Array
                        (
                            [name] => Emirates
                            [code] => EK
                        )

                    [3] => Array
                        (
                            [name] => Egyptair
                            [code] => MS
                        )

                )

            [bookingType] => WEBSITE
            [price] => Array
                (
                    [name] => 
                    [nameOTA] => 
                    [description] => 
                    [amount] => 26280
                    [totalAmount] => 26280
                    [pricePerPassenger] => 26280
                    [currencyCode] => EGP
                    [totalPricePerPassenger] => 26280
                    [includesTax] => 1
                )

            [generatedDate] => 1380212804686
            [providerId] => emirates.com
            [id] => MS703[CAI-MXP],EK205[MXP-JFK],US3407[JFK-PHL]|DL3672[PHL-JFK],EK204[JFK-DXB],EK923[DXB-CAI]
            [originCountryCode] => EG
            [bookingCode] => 13600077136293253
            [destinationCountryCode] => US
            [outboundInfo] => Array
                (
                    [aircraftTypes] => Array
                        (
                        )

                    [departureTime] => 1380958800000
                    [layoverInMin] => 1050
                    [flightNumbers] => Array
                        (
                            [0] => MS703
                            [1] => EK205
                            [2] => US3407
                        )

                    [durationInMin] => 1940
                    [airportsExpanded] => Array
                        (
                            [0] => CAI
                            [1] => MXP
                            [2] => MXP
                            [3] => JFK
                            [4] => JFK
                            [5] => PHL
                        )

                    [localDepartureTimeStr] => 2013/10/05 09:40 +0200
                    [airports] => Array
                        (
                            [0] => CAI
                            [1] => MXP
                            [2] => JFK
                            [3] => PHL
                        )

                    [arrivalTime] => 1381075200000
                    [numStops] => 2
                    [flightClasses] => Array
                        (
                            [0] => Array
                                (
                                    [name] => Economy
                                    [fareClass] => 1
                                )

                            [1] => Array
                                (
                                    [name] => Economy
                                    [fareClass] => 1
                                )

                            [2] => Array
                                (
                                    [name] => Economy
                                    [fareClass] => 1
                                )

                        )

                    [localArrivalTimeStr] => 2013/10/06 11:00 -0500
                )

        )

    [1] => Array
        (
            [ecpcRank] => 0
            [inboundInfo] => Array
                (
                    [aircraftTypes] => Array
                        (
                        )

                    [departureTime] => 1381448400000
                    [layoverInMin] => 1359
                    [flightNumbers] => Array
                        (
                            [0] => DL3672
                            [1] => EK204
                            [2] => EK923
                        )

                    [durationInMin] => 2360
                    [airportsExpanded] => Array
                        (
                            [0] => PHL
                            [1] => JFK
                            [2] => JFK
                            [3] => DXB
                            [4] => DXB
                            [5] => CAI
                        )

                    [localDepartureTimeStr] => 2013/10/10 18:40 -0500
                    [airports] => Array
                        (
                            [0] => PHL
                            [1] => JFK
                            [2] => DXB
                            [3] => CAI
                        )

                    [arrivalTime] => 1381590000000
                    [numStops] => 2
                    [flightClasses] => Array
                        (
                            [0] => Array
                                (
                                    [name] => Economy
                                    [fareClass] => 1
                                )

                            [1] => Array
                                (
                                    [name] => Economy
                                    [fareClass] => 1
                                )

                            [2] => Array
                                (
                                    [name] => Economy
                                    [fareClass] => 1
                                )

                        )

                    [localArrivalTimeStr] => 2013/10/12 17:00 +0200
                )

            [location] => Array
                (
                    [0] => Array
                        (
                            [code] => CAI
                            [name] => Cairo
                        )

                    [1] => Array
                        (
                            [code] => PHL
                            [name] => Philadelphia
                        )

                    [2] => Array
                        (
                            [code] => DXB
                            [name] => Dubai
                        )

                    [3] => Array
                        (
                            [code] => JFK
                            [name] => New York J F Kennedy
                        )

                )

            [carrier] => Array
                (
                    [0] => Array
                        (
                            [name] => Delta Air Lines
                            [code] => DL
                        )

                    [1] => Array
                        (
                            [name] => Emirates
                            [code] => EK
                        )

                )

            [bookingType] => WEBSITE
            [price] => Array
                (
                    [name] => 
                    [nameOTA] => 
                    [description] => 
                    [amount] => 28183
                    [totalAmount] => 28183
                    [pricePerPassenger] => 28183
                    [currencyCode] => EGP
                    [totalPricePerPassenger] => 28183
                    [includesTax] => 1
                )

            [generatedDate] => 1380212804689
            [providerId] => emirates.com
            [id] => EK928[CAI-DXB],EK203[DXB-JFK],DL6122[JFK-PHL]|DL3672[PHL-JFK],EK204[JFK-DXB],EK923[DXB-CAI]
            [originCountryCode] => EG
            [bookingCode] => 13600077139546083
            [destinationCountryCode] => US
            [outboundInfo] => Array
                (
                    [aircraftTypes] => Array
                        (
                        )

                    [departureTime] => 1380966900000
                    [layoverInMin] => 947
                    [flightNumbers] => Array
                        (
                            [0] => EK928
                            [1] => EK203
                            [2] => DL6122
                        )

                    [durationInMin] => 2118
                    [airportsExpanded] => Array
                        (
                            [0] => CAI
                            [1] => DXB
                            [2] => DXB
                            [3] => JFK
                            [4] => JFK
                            [5] => PHL
                        )

                    [localDepartureTimeStr] => 2013/10/05 11:55 +0200
                    [airports] => Array
                        (
                            [0] => CAI
                            [1] => DXB
                            [2] => JFK
                            [3] => PHL
                        )

                    [arrivalTime] => 1381093980000
                    [numStops] => 2
                    [flightClasses] => Array
                        (
                            [0] => Array
                                (
                                    [name] => Economy
                                    [fareClass] => 1
                                )

                            [1] => Array
                                (
                                    [name] => Economy
                                    [fareClass] => 1
                                )

                            [2] => Array
                                (
                                    [name] => Economy
                                    [fareClass] => 1
                                )

                        )

                    [localArrivalTimeStr] => 2013/10/06 16:13 -0500
                )

        )

)

4

8 に答える 8

4

質問に答えるには:

しかし、それにはもっと時間がかかります..この大きな時間を短縮するにはどうすればよいですか?

それを減らす前に、それがどこから来るのかを正確に知る必要があります。コメントに書いたように、リモートリクエストを使用してデータを取得しています。

提供したデータの配列の並べ替えは非常に高速に機能するため、配列の並べ替えを最適化する必要はなく、リモートからデータをいつどのように取得するかだけを最適化する必要があると思います。これを行う 1 つの方法は、それをキャッシュするか、プリフェッチするか、並列処理を行うことです。しかし、これまでの詳細はまったく重要ではありません。それがどこから来ているのかを見つけて、何が大きな時間の原因であるかを明確にし、それを削減することを検討できる場合を除きます.

これまでのところお役に立てば幸いです。不足している情報を質問に追加してください。

ここで配列のみのコードの動作を確認できます。これは非常に高速です。

出力のすぐ下にある実行統計を見つけることができます。

OK (実質 0.008 秒、壁 0.006 秒、14 MB、システムコール 99)

于 2013-10-01T12:14:13.327 に答える
2

実際にプロファイラー (XHProf)をインストールして、何がそんなに時間がかかるのかを確認する必要があります。

foreach5つの要素の最終的な配列を介して高速になるはずなので、それはソートだと思います。ではなぜ並べるのか?並べ替えの唯一の目的が「最下位」の 5 つの項目を見つけることである場合、最速の方法は最下位の 5 つの項目を見つけることです。

$min5 = array();
foreach ($flights_result->json_data['response']['itineraries'] as $key => $value)
{
    $amount = $value['price']['totalAmount'];

    // Just put first 5 elements in our result array
    if(count($min5) < 5) {
        $min5[$key] = $amount;
        continue;
    }
    // Find largest element of those 5 we check
    $maxMinK = null;
    foreach($min5 as $minK=>$minV) {
        if($maxMinK === null) {
            $maxMinK = $minK;
            continue;
        }
        if($minV > $min5[$maxMinK])
        {
            $maxMinK = $minK;
        }
    }
    // If our current amount is less than largest one found so far,
    // we should remove the largest one and store the current amount instead
    if($amount < $min5[$maxMinK])
    {
        unset($min5[$maxMinK]);
        $min5[$key] = $amount;
    }
}
asort($min5); // now we can happily sort just those 5 lowest elements

あなたの場合、ソートO(6n)の可能性よりも優れているはずの5つのアイテムが見つかります。O(n²)次に、次のように使用できます。

foreach($min5 as $key=>$minValue)
{
    $intinerary = $flights_result->json_data['response']['itineraries'][$key]
    ...
}

並べ替えがあれば、これははるかに高速になるはずです。そのXHprofを入手してチェックしてください:)

于 2013-09-29T08:58:40.163 に答える
0

コードの速度を低下させる可能性のある領域が 2 つあります。

  • 配列のソート
  • エコー + これらすべての文字列を連結する文字列

まず、遅延の原因となっている領域を特定します。プロファイリングが難しい場合は、デバッグ用の print ステートメントをコードに挿入し、各ステートメントで現在の時刻を表示できます。これにより、コードのどの領域に多くの時間がかかっているかを大まかに把握できます。何かのようなもの:

echo "Time at this point is " . date();

これらの結果が得られたら、さらに最適化できます。

于 2013-09-30T17:51:56.563 に答える
0

これを試して...

$arr_fli = array(0 => array('f_name'=> 'Flight1', 'price' => 2000),
                 1 => array('f_name'=> 'Flight1', 'price' => 5000),
                 3 => array('f_name'=> 'Flight1', 'price' => 7000),
                 4 => array('f_name'=> 'Flight1', 'price' => 4000),
                 5 => array('f_name'=> 'Flight1', 'price' => 6000),
                 6 => array('f_name'=> 'Flight1', 'price' => 800),
                 7 => array('f_name'=> 'Flight1', 'price' => 1000),
                 8 => array('f_name'=> 'Flight1', 'price' => 500)
            );
foreach($arr_fli as $key=>$flights) {
    $fl_price[$flights['price']] = $flights;
}
sort($fl_price);
$i = 0;
foreach($fl_price as $final) {
    $i++;
    print_r($final);
    echo '<br />';
    if($i==5) {
        break;
    }
}
于 2013-10-01T11:22:25.810 に答える
0

最初に理解しておくべきことは、コードのどの部分の実行に時間がかかるかです。手早く汚いが簡単な方法は、ロガーを使用することです。メモリ使用量、ディスク使用量、ユーザー要求、購入など、コードの実行中に保持したい他のすべての情報をログに記録するために既に使用していると思います.

ロガーは、非常に洗練されたツール (「loggin フレームワーク」などを検索するだけ) の場合もあれば、ファイルへのメッセージ ライターのような単純な場合もあります。すぐに始めるには、次のようなものを使用できます。

class Logger {
  private $_fileName;
  private $_lastTime;

  public function __construct ($fileName) {
    $this->_fileName = $fileName;
    $this->_lastTime = microtime(true);
  }

  public function logToFile ($message) {
    // open file for writing by appending your message to the end of the file
    $file = fopen($this->_fileName, 'a');
    fwrite($file, $message . "\n");
    fclose($file);
  }

  // optional for testing - see your logs quickly without bothering with files
  public function logToConsole($message) {
    echo $message;
  }

  // optional $message to add, e.g. about what happened in your code
  public function logTimePassed ($message = '') {
    $timePassed = microtime(true) - $this->_lastTime;
    //$this->logToConsole("Milliseconds Passed since last log: " . $timePassed . ", " . $message . "\n");
    $this->logToFile("Milliseconds Passed since last log: " . $timePassed . ", " . $message . "\n");
    // reset time
    $this->_lastTime = microtime(true);
  }
}

// before your code starts
$myLogFileName = 'my-logs'; // or whatever the name of the file to write in
$myLogger = new Logger($myLogFileName);

// ... your code goes ...

// after something interesting
$myLogger->logTimePassed(); // log time since last logging

// ... your code continues ...

// after something else, adding a message for your record
$myLogger->logTimePassed("after sorting my flight array"); 

これで、コードを調べて、時間がかかりすぎる可能性のあるすべての重要なポイントにロガーを配置できます。何が起こったのかを知るためにメッセージを追加してください。潜在的に多くの場所で遅延が発生する可能性があります。通常、メモリ内で行われる配列操作は非常に高速です。ただし、次のような時間のかかる操作には、より注意を払う必要があります。

  • ファイルの読み書き、ディレクトリアクセス
  • データベースへのアクセス
  • HTTP リクエスト

たとえば、http リクエスト -echoネットワーク経由でブラウザにすぐに送信されますか? それらはループ内で毎回送信されていますか? はいの場合、おそらくそれを避けたいと思うでしょう。他の回答で示されているように配列に保存するか、Output Bufferingを使用してください。

さらに、サーバーへの http 要求を最小限に抑えるために、クライアント側により多くの機能を配置し、ajax を使用してサーバーから本当に必要なものだけを取得することができます。

また、隠れていることも忘れないでください。たとえば、オブジェクト プロパティへのアクセスが表示されます。

$flights_result->json_data

このオブジェクトはどのように実装されていますか? インメモリのみですか?外部サービスを呼び出しますか? もしそうなら、それはあなたの犯人かもしれません。次に、それを最適化する作業を行う必要があります。クエリをキャッシュすることでクエリの数を減らし、データを最適化して変更をクエリするだけで済むようにするなど。これはすべてアプリケーションの構造に依存し、コードの残りの部分とは関係がない場合があります。それについて何か助けが必要な場合は、明らかにこの情報を質問に入れる必要があります。

基本的に、メモリ内で完全に実行されていないことはすべて、遅延を引き起こす可能性があります。インメモリ操作に関しては、データが巨大であるか、操作が激しい場合を除き、その影響はほとんどありません。それでも疑問がある場合は、すべての「疑わしい」場所にロガーを配置してください。


特定のコードでは、外部オブジェクト アクセス、配列値アクセス、配列の並べ替え、エコー出力など、あらゆる種類のものが混在しています。これにより、タイム ロガーをどこに配置すればよいかさえわかりにくくなります。

オブジェクト指向のアプローチを使用し、とりわけ、懸念の分離の原則に従うことで、はるかに簡単になります(Googleで検索してください)。そうすれば、オブジェクトとそのメソッドが単一の責任を持ち、誰が何をし、どこにロガーを配置するかを簡単に確認できます。

それについてもっと学ぶために、「ボブおじさん」の伝説的な本を強くお勧めすることはできません. あなたのコードは関数内から来ていると思います。ボブおじさんによると:

関数の第一のルールは、小さくあるべきだということです。2 番目のルールは、それよりも小さくする必要があるということです。

関数は 1 つのことを行う必要があります。彼らはそれをうまくやるべきです。彼らはそれをするだけです。

コードをより多くの関数に分割する場合、コードの可読性を大幅に向上させるために、それらの関数に意味のある名前を付ける必要があります。言うまでもなく、クラス外での使用を意図していないすべての関数はプライベートにする必要があるため、継承によってクラスを簡単に再利用できます。


できることはたくさんありますが、まず始めにいくつかのアイデアを以下に示します。

  • 必要なことだけを行うメソッドを使用して、データ配列をオブジェクトにカプセル化します。そんな感じ:

    class Itineraries {
      private $_itineraryArray;
    
      public function __construct(array $itineraryArray) {
        $this->_itineraryArray = $itineraryArray;
      }
    
      public function getNCheapest ($number) {
        $this->_sortByPrice();
        $result = array();
        for ($i=0; $i< $number; $i++) {
          $result[] = $this->_itineraryArray[$i];
        }
        return $result;
      }
    
      private function _sortByPrice() {
        $prices = $this->_getPriceArray();
        array_multisort($prices, SORT_ASC, $this->_itineraryArray);
      }
    
      private function _getPriceArray () {
        foreach ($this->_itineraryArray as $entry) {
          $this->_getPrice($entry);  
        }
      }
    
      private function _getPrice($entry) {
        return $entry['price']['totalAmount']; // or whatever it is
      }
    }
    
    //Then you instantiate your object:
    $myItineraries = new Itineraries($flights_result->json_data['response']['itineraries']); // or whatever
    

_getPrice 配列構造が完全に変更された場合でも、オブジェクトをインスタンス化するためにメソッドと 1 行を調整するだけでよいことに注意してください。コードの残りの部分はそのまま残ります。

これは、Model-View-Controller パラダイムのモデル レイヤーの一部です。それをグーグルで検索すると、多くの情報を見つけることができます。モデルはそのデータの処理方法を知っていますが、それらのソース、ブラウザー出力、http リクエストなどについては何も知りません。

  • 次に、ユーザー出力の生成を担当するすべてのものは、View Layer またはいわゆる Presenter Layer に入ります。そこでは、それを処理する他のオブジェクトがあります。あなたのすべてのエコーはここに行きます。そんな感じ:

    class Presenter {
      public function outputNCheapest ($myItineraries, $number) {
        $outputData = $myItineraries->getNCheapest ($number);
        echo $this->generateOutput($outputData);
      }
    
      private function _generateOutput($outputData) {
        $html = '';
        // your html string is generated
        return $html;
      }
    }
    

しかし、個人的にはサーバー上で HTML を生成することに反対です。これは、帯域幅と、ユーザーが応答を待つ時間の無駄です。ブラウザがページ全体をリロードするのを待つたびに、開発者にこれを読んでもらいたい. HTML の代わりに JSON を出力し、ajax またはクライアント側の他の方法でリクエストできます。

さらに、ユーザーのブラウザーは、データを再要求する代わりにデータの一部をキャッシュし、何を要求するかを決定できます。これにより、ユーザーの遅延をさらに最小限に抑えることができます.1日の終わりには、まさにあなたが懸念していることです.

于 2013-10-03T18:15:46.973 に答える