1
(
    [1] => Array
        (
            [rules_properties_id] => 1
            [operator] => >=
            [value] => 2
            [function] => NumOrdersPlaced
            [rules_properties_params] => Array
                (
                    [num_days] => 30
                    [customer_id] => 5
                )

        )

    [2] => Array
        (
            [rules_properties_id] => 1
            [operator] => >=
            [value] => 5
            [function] => NumOrdersPlaced
            [rules_properties_params] => Array
                (
                    [num_days] => 90
                    [customer_id] => 5
                )

        )

    [3] => Array
        (
            [rules_properties_id] => 2
            [operator] => >
            [value] => 365
            [function] => CustAcctAge
            [rules_properties_params] => Array
                (
                    [customer_id] => 5
                )

        )

)

これprint_rは、データベースから取得している配列です。NumOrdersPlacedという関数を含むサブ配列のインデックス番号を見つける必要があります(期待される結果は2になります)。これを行う唯一の方法は、配列とサブ配列をループして比較することです(この回答のように)?それとも、私が知らない、より効率的でエレガントな(つまりワンライナー)機能が利用できますか?

4

1 に答える 1

0

いいえ、PHPで多次元配列を検索するための1つのライナーはありません。自分で関数を作成し、それを1つのライナーとして使用することを期待してください:)

アプローチは次のようになります。

  1. データ構造を、検索操作に適したものに変更します。例:xpathを使用したxml
  2. 質問から配列を作成するときは、インデックスが関数名であり、値が元の配列のサブ配列へのポインターである別の配列を作成します
  3. その操作にはデータベースを使用してください。それのために最適化されています
  4. ..。

「正しい」方法で検索する場合は、検索のパフォーマンス、挿入、更新、削除操作、メモリ消費、および使いやすさの間の妥協点を見つける必要があります。


PHPソリューションを求めたので、追加のインデックス配列を使用してPHPでそれを行う方法の例を次に示します:(上記のリストからのアプローチ2

// we need two arrays now:
$data = array(); 
$index = array();

// imagine you loop through database query results
foreach($db_result as $record) {
    // create a copy of $record as the address
    // of record will contain the last(!) element agter foreach
    $item = $record;

    // store pointers to that array in data and index
    $data []= &$item;
    $index[$item->function] = &$item;
}


// here is your one liner
$found = isset($index['NumOrdersPlaced']) ? $index['NumOrdersPlaced'] : NULL;

// another index seach:
$found = isset($index['CustAcctAge']) ? $index['CustAcctAge'] : NULL;

// note there is no additonal loop. The cost is the 
// additional memory for $index
于 2013-01-30T17:31:10.320 に答える