1

私は次の配列を持っています(たとえば、実際の配列の方が大きいです)

Array
(
    [0] => Array
        (
            [984ab6aebd2777ff914e3e0170699c11] => Array
                (
                  [id] => 984ab6aebd2777ff914e3e0170699c11
                  [message] => Test1

        )

    [1] => Array
        (
            [ca403872d513404291e914f0cad140de] => Array
                (
                  [id] => ca403872d513404291e914f0cad140de
                  [message] => Test2
                )

        )

    [2] => Array
        (
            [ca403872d513404291e914f0cad140de] => Array
                (
                  [id] => ca403872d513404291e914f0cad140de
                  [message] => Test3

        )

    [3] => Array
        (
            [ca403872d513404291e914f0cad140de] => Array
                (
                  [id] => ca403872d513404291e914f0cad140de
                  [message] => Test4
                )

        )
)

ここで、指定されたIDのサブ配列に何らかの方法で「アクセス」したいと思います。たとえば、ID 984ab6aebd2777ff914e3e0170699c11のサブ配列にアクセスしてから、このようなforeachでこの配列を使用します。

foreach ($array_with_specific_id as $event) {
    echo $event['message'];
}

これは可能ですか?

編集:

モデルで配列を生成するためのDBコード:

  public function get_event_timeline($id)
   {
     $data = array();
      foreach ($id as $result) {
          $query = $this->db->query("SELECT * FROM event_timeline WHERE id = ?", array($result['id']));
          foreach ($query->result_array() as $row)
          {
               array_push($data, array($row['id'] => $row));
          }
      }

      return $data;
   }
4

3 に答える 3

1

データベースからアレイにデータを入力する場合$index、次のスキームのように追加のアレイを作成できます。

$index = array (
    '984ab6aebd2777ff914e3e0170699c11' => ReferenceToElementInData,
    'ca403872d513404291e914f0cad140de' => ReferenceToElementInData,
    // ...
)

これにより、追加のforeachループなしで、IDを介して要素にすばやくアクセスできます。もちろん、追加のメモリが必要になりますが、元のデータへの参照のみを保存するため、これで問題ありません。ただし、テストしてください。

次に例を示します。

public function get_event_timeline($id)
{
  $data = array();

  // create an additional index array
  $index = array();

  // counter 
  $c=0;

  foreach ($id as $result) {
      $query = $this->db->query("SELECT * FROM event_timeline WHERE id = ?", array($result['id']));

      // every entry in the index is an array with references to entries in $data
      $index[$result['id']] = array();

      foreach ($query->result_array() as $row)
      {
           array_push($data, array($row['id'] => $row));
           // create an entry in the current index
           $index[$row['id']][] = &$data[$c];
           $c++;
      }
  }

  return array (
      'data' => $data,
      'index' => $index
  );
}

これで、追加のforeachループなしで、インデックス配列を介して要素にアクセスできます。

$entry = $index['984ab6aebd2777ff914e3e0170699c11'][0];

あたりに複数の結果がある場合$id(コメントで述べたように、ゼロより大きいインデックスを使用してそれらにアクセスできます:

$entry = $index['984ab6aebd2777ff914e3e0170699c11'][1];
$entry = $index['984ab6aebd2777ff914e3e0170699c11'][2];

$idを呼び出すことで、あたりのアイテム数を取得できます

$number = count($index['984ab6aebd2777ff914e3e0170699c11']);

これは、クエリを高速化するためにデータベースで使用されるインデックスとほとんど同じです。

于 2013-02-05T16:44:27.180 に答える
0

含まれている配列は不要と思われるので、おそらく削除するだけです。ただし、次のようなことができます。

function get_message($specific_id, $arrays) {
    foreach($arrays as $array) {
        if(in_array($specific_id, $array)) {
            return $array['message'];
        }
    }
}

これをテストする機会はありませんでしたが、機能するはずです。

于 2013-02-05T16:37:04.973 に答える
0
function doTheJob($inputArray, $lookingFor) {

    foreach ($inputArray as $subArray) {
        foreach ($subArray as $subKey => $innerArray) {
            if ($subKey == $lookingFor) {
                return $innerArray;
            }
        }
    }
    return NULL;
}

array_filterまたは、 outerの代わりに使用することもできますforeach

于 2013-02-05T16:44:12.780 に答える