首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按键值取数组的子数组

按键值取数组的子数组
EN

Stack Overflow用户
提问于 2013-02-06 00:32:26
回答 3查看 3.2K关注 0票数 1

我有以下数组(例如,实数组更大)

代码语言:javascript
复制
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中使用此数组。

代码语言:javascript
复制
foreach ($array_with_specific_id as $event) {
    echo $event['message'];
}

这个是可能的吗?

编辑:

在我的模型中生成数组的DB代码:

代码语言:javascript
复制
  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;
   }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-06 00:44:27

当从数据库填充您的数组时,您可以验证一个额外的$index数组,如下所示:

代码语言:javascript
复制
$index = array (
    '984ab6aebd2777ff914e3e0170699c11' => ReferenceToElementInData,
    'ca403872d513404291e914f0cad140de' => ReferenceToElementInData,
    // ...
)

这可以让您通过元素的id快速访问元素,而不需要额外的foreach循环。当然,它将需要额外的内存,但这应该是可以的,因为您将只保存对原始数据的引用。但是,对其进行测试。

下面是一个示例:

代码语言:javascript
复制
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循环:

代码语言:javascript
复制
$entry = $index['984ab6aebd2777ff914e3e0170699c11'][0];

如果每个$id有多个结果(如您在注释中提到的,您可以使用大于零的索引来访问它们:

代码语言:javascript
复制
$entry = $index['984ab6aebd2777ff914e3e0170699c11'][1];
$entry = $index['984ab6aebd2777ff914e3e0170699c11'][2];

您可以通过调用以下方法获取每个$id的项目数

代码语言:javascript
复制
$number = count($index['984ab6aebd2777ff914e3e0170699c11']);

这与数据库中用于加快查询速度的索引非常相似。

票数 1
EN

Stack Overflow用户

发布于 2013-02-06 00:37:05

我可能只是去掉了包含数组,因为它看起来不必要。但是,您可以执行以下操作:

代码语言:javascript
复制
function get_message($specific_id, $arrays) {
    foreach($arrays as $array) {
        if(in_array($specific_id, $array)) {
            return $array['message'];
        }
    }
}

我还没有机会测试它,但它应该可以工作。

票数 0
EN

Stack Overflow用户

发布于 2013-02-06 00:44:13

代码语言:javascript
复制
function doTheJob($inputArray, $lookingFor) {

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14712279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档