2013-02-05 104 views
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; 
    } 
+0

它需要两个使用主阵列的方法,对于这个例子来说是可以的。 – 2013-02-05 16:35:06

+0

阵列如何填充?从数据库? – hek2mgl

+0

是的,我会添加DB代码 – edwardmp

回答

1

当从数据库填充数组您可以创造学习额外$index阵列像以下方案:

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

这可以让你快速访问通过其ID的元素,而无需额外的foreach循环。当然,它需要额外的内存,但这应该是可以的,因为您只会将参考保存到原始数据。但是,测试它。

这里谈到的例子:

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]; 

你可以通过调用

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

这是很多,在数据库用在加快查询速度同样喜欢指标得到每$id的项目数。

+0

这似乎工作谢谢..但我有一点点其他问题。查询可以为每个flight_id产生多个结果。现在只有一个结果。任何想法如何解决这个问题?我应该循环通过每个ID的多个事件 – edwardmp

+0

我不确定是否理解正确..我这样的情况下,你期望我的代码:'$ entry = $ index [$ flight_id]'会返回两个记录,是吗? – hek2mgl

+0

是的,确切!但它可能超过两条记录 – edwardmp

0

我可能刚刚摆脱了含有阵列的,因为它似乎没有必要。但是,你可以这样做:

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

我还没有机会测试这一点,但它应该工作

+0

什么是最好的摆脱方式包含数组的数组?检查我的帖子,看看型号代码 – edwardmp

0
function doTheJob($inputArray, $lookingFor) { 

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

或者,你可以使用array_filter,而不是外foreach