2

現在の PHP インタープリター (5.4) がアイテムごとの配列ソートではなく、約 3 ~ 5 個のコピーを単純に実行できるほどスマートなソリューションを作成するにはどうすればよいでしょうか?

要素をインデックス付き配列に挿入する方法をいくつか知っていることに注意してください。しかし、これは私の理解を満足させません。たとえば、C++ では、 std::copy を使用して何かを実行したり、構造体または共用体を複数要素の配列カーソルとして作成したりできます。

だから私はどういうわけかPHPのルールで遊んでいるのだろうか、どの構文を使用して、ボンネットの下で何かに近いものを持つことができるのだろうか

[あるインデックスからA の終わりまでの要素の範囲] を一時 C にコピーします

BをA[インデックス]にコピーし、

C を A[Index+count(B)] にコピー

これより...

$MasterItemList = $Page[$CurrentPage]->GetItems();   /* Returns an array with 512 Items.         */
$UpdateList = GetUpdatePage();                       /* Returns multi-dimensional array such that: 
                                                        $result[][0]=an index and 
                                                        $result[][1]=a list of items             */

foreach($UpdateList as $Update)
{ foreach($Update as $cursor => $ItemList)
  {
    $cursor=$cursor+0;  //to int..
    $numitems=count($ItemList);

    if($ItemList[0]->NewAddition)
    {
      $BeforeUpdate=array_splice($MasterItemList,0, $cursor, true);
      $AfterUpdate=array_splice($MasterItemList, $cursor+$numitems, 0);
      $MasterItemList=array_merge($BeforeUpdate,$ItemList,$AfterUpdate);

      $Page[$CurrentPage]->OffsetCorrection+=$numitems;
    }
    else
    {
      $i=0;
      foreach($ItemList as $LineItem)
      {
        $MasterItemList[$cursor+$i] = $LineItem;
        $i++;
      }
    }
  }
}

これを書き留めていくつかのエラーがある場合は、ご容赦ください。お知らせください。修正します。

つまり、このメソッドを使用してロジックを直接実行できるようにするために、適切な参照とスコープがインタープリターで利用できるとは思いません。それはすでに非常に高価に見えます.. PHP でこれを「正しい方法」で実行するにはどうすればよいでしょうか?

例:

// An Update List

Array(
    [0] => Array(
        [0] => 31
        [1] => Array(
            [1] => stdClass Object 
                (
                    [NewAddition] => false
                    [Name] => "********"
                    [Date] => 1364920943
                    [Active] => 1
                    .
                    .
                    .
                )

            [2] => stdClass Object 
                (
                    [NewAddition] => false
                    [Name] => "********"
                    [Date] => 1364920943
                    [Active] => 1
                    .
                    .
                    .
                )

            [3] => stdClass Object 
                (
                    [NewAddition] => false
                    [Name] => "********"
                    [Date] => 1364920943
                    [Active] => 1
                    .
                    .
                    .
                )

        )                
    )
)

AndMasterItemListは単にこれらの同じオブジェクトの配列です ( class Item)。

いくつかの注意事項:

  • このデータは、このスクリプトにとって重要な場所では、純粋にシーケンシャルな方法でのみアクセスされます。
  • スクリプトのこの部分では、新しく挿入されたセットの最初の項目のみを更新のためにチェックする必要があります。セット内の以下のすべてのアイテムは、常に新しいものになります。
  • 512 を超える項目は、次のページ読み込みに自動調整されます。ページのサイズを調整して、配列の並べ替えのパフォーマンスとデータのフェッチのパフォーマンス (非同期バッファー) を交換できます。
4

1 に答える 1

3

まず第一に、PHP 配列はデータ構造の意味での「配列」ではありません。それらは実際にはハッシュ テーブルと二重にリンクされたリストが 1 つにまとめられたものです。$list[$i] $i対応する要素を見つけるためにハッシュされているなど、配列にインデックスを付けている場合。たとえばC ++のように単純な算術演算ではありません。

さらに、配列もリンク リストであるためarray_splice、少なくとも削除される部分が十分に小さい場合 (新しいアイテムのハッシュは通常高速であり、リンク リストの特定の場所にアイテムを挿入する場合) の実装は、見た目よりもはるかに効率的です。一定時間です)。

もちろんこれは、PHP 配列が「純粋な」配列よりもはるかに多くのメモリを消費することを意味し、インデックスベースのアクセスだけを意図している場合は遅くなります。そのような状況では、SPL はSplFixedArray、言葉のデータ構造の意味での配列の実装を提供します。

あなたの特定のケースでarray_spliceは、最初のオプションにする必要があります。1 回の呼び出しで配列チャンクを挿入できます。

array_splice($MasterItemList, $cursor, 0, $ItemList);
于 2013-04-04T08:55:09.647 に答える