3

私はこの $_POST 配列のものを持っています:

  'name' => string '' (length=0)
  'limit' => string '100' (length=3)

  'timeframe' => 
    array
      'start' => string '00:00' (length=5)
      'end' => string '23:30' (length=5)

  'person' => 
    array
      'test' => string '' (length=0)
      'title' => 
        array
          0 => string 'value1' (length=2)
          1 => string 'value2' (length=3)

という名前のフィールドのデータを抽出したいのですperson[title][]が、これを効率的に行う最善の方法は何ですか?

実際には、問題をこの例に絞り込みましたが、コード内の任意の配列名フィールドのデータを抽出できるように、これをより一般的に実装しています。

前もって感謝します


更新 1

わかりました、私は不明確だったと思います、ここに再び問題があります:

この形式のフィールド名があります。name_1[name_2]..[name_n][]その値は$_POST連想配列で利用できます。その値を抽出する必要があります (最後に [] があるため配列です)。

または何かを実行して元のフィールド名からサブネームpreg_matchを抽出し、抽出されたインデックスを使用して値が見つかるまで配列をループします。しかし、これが本当に最善かつ/または効率的な方法であるかどうかはわかりません。

初めまして、わかりづらくてすみません(^^)


更新 2

皆さん、問題をこの例に絞り込んだと言いましたがperson、実際のアプリケーションには何もありません。私は、データの膨大な配列と格闘するためのデータ パーサー エンジンを開発していますが、その機能はまさに必要なものです。それを願っています;今は明らかです。

皆さんありがとうございます^^

4

4 に答える 4

3

私は使用します$title = $_POST['perosn']['title']

または、人全体をオブジェクトに変換することもできます。

$person = (object)$_POST['person'];
echo $person->name // Call it
于 2012-09-02T10:20:10.497 に答える
0

さて、ここに行きます:

/**
 * Extracts value from an associative array by fieldname sequence.
 *
 * Example:
 *
 * This string:
 * my_group[my_subgroup][multiselect_field][]
 *
 * Requests the helper to extract the value of: (if exists)
 * $array[my_group][my_subgroup][multiselect_field]
 *
 * @param  string $name  Fieldname string.
 * @param  array  $array Haystack array to dig.
 *
 * @return array  Extracted value or FALSE on failure.
 */
function _extract_value($name, array $array)
{
    // Check if it's a array fieldname, go for brackets
    if (strpos($name, '[') !== FALSE AND preg_match_all('/\[(.*?)\]/', $name, $matches))
    {
        $count  = count($matches[0]);
        $keys[] = current(explode('[', $name));

        // Extract fieldname keys
        for ($i = 0; $i < $count; $i++)
        {
            $matches[1][$i] != '' AND $keys[] = $matches[1][$i];
        }

        return _reduce($array, $keys);
    }

    return FALSE;
}

// --------------------------------------------------------------------

/**
 * Helper: Reduces the array by the passed array of keys which leds to find the value!
 *
 * Traverses a multi-dimensional array until the value of the keys specified
 * in keys array is found. Returns FALSE if not found.
 *
 * @param  array   $array Array to reduce.
 * @param  array   $keys  Array keys sequence. Traverse map in fact.
 * @param  integer $i     $keys array index to start from.
 *
 * @return array          Extracted value or FALSE on failure.
 */
function _reduce($array, $keys, $i = 0)
{
    // Not an array, or a wrong index to start
    if ( ! is_array($array) OR ! isset($keys[$i]))
    {
        return $array;
    }

    // Go deep, find the value
    return isset($array[$keys[$i]])
        ? _reduce($array[$keys[$i]], $keys, $i + 1)
        : FALSE;
}

// --------------------------------------------------------------------

$titles = _extract_value('', $_POST);
var_dump($titles);

CodeIgniterのForm_validationライブラリから取得。

于 2012-09-02T14:49:56.157 に答える
0

質問に非常に具体的にするには:

person[役職][] という名前のフィールドのデータを抽出したいのですが、これを効率的に行うための最良の方法は何ですか?

うーん、<? $person[title][]?>--- それは読書には使えません。このまま読み込もうとすると、PHP で致命的なエラーが発生します。[]指定された配列に新しい要素をプッシュするために使用します。繰り返しますが、新しいアイテムのみを追加してください。keyそれらを読み取るには、必要な配列のみにアクセスします。

あなたの場合、アクセスします$_POST['person']['title']

あなたはそれを行うための最良の方法について尋ねていますが、それはすべてあなたが扱っているタスクに依存します.

さて、私たちが話しているのであれば$_POST、おそらく私たちはフォームを扱っています. コードをクリーンで保守しやすい状態に保つために、実際に持っているようなより深い配列を使用する必要があります。

なんで?

(配列を定義しているように見えます<input type="text" name="name_of_the_current[]">) 深くする必要はありません。

アップデート

ねえ、私たちは単純な形を扱っています。$_POST が深すぎるのはなぜですか? いずれにせよ、次の理由から、それは良い考えではありません。

HTML/PHP1)既存のコードを維持するのが少し難しくなります。コード内の何かを更新/変更する必要があるかどうか想像してみてください。しばらくかかりそうです。

2)Deep arrayは、それを反復するのにもう少し時間がかかることも意味します。(約0.0008ミリ秒(あなたの場合)、間違っている場合は修正してください)

申し訳ありませんが、より適切なものを提案する必要があります:)

1) まず、その人はPRIMARY AND UNIQUE KEYですよね?そうだと思います。

たとえば、ほとんどの php 開発者は通常、次のようにします。

<?php
//suppose we have it from database or from
$persons = array
(
  'john_123' => array('age' = 40, 'gender' =>'M', 'location' => 'somewhere'),
  'linde_22' => array('age' = 30, 'gender' =>'F', 'location' => 'somewhere_else')  
);

//
print $persons['john_123']['age']; //prints 40...
?>

利点:

  1. きれいです
  2. メンテナンスが容易
  3. 深すぎない
  4. 少し速い
于 2012-09-02T10:35:49.507 に答える
0

Pre-optimization is the devil - Until you're really at a place where you're encountering that this piece of code causes the bottleneck in your software development efforts, you should really avoid any optimization, it'll be more likely that your bottlenecks will be in the DB, way before you'll notice a drop in speed.

First - make it work. Second - improve it.

From the array you've provided, you can do the following:

foreach ($arr['person']['title'] as $title){
  if ($title == $match_condition) // do something
}
于 2012-09-02T11:09:49.253 に答える