【问题标题】:Access subset array with foreach [duplicate]使用 foreach 访问子集数组 [重复]
【发布时间】:2018-06-06 13:58:42
【问题描述】:

我有这样的数组

知道如何使用foreach 或类似这样的快速访问#items 子集吗?

Array
(
    [0] => Array
        (
            [#theme] => item_list
            [#items] => Array
                (
                    [0] => Array
                    (
                        [nid] => 1
                        [changed] => 1514034947
                        [title] => TITLE 1
                    )

                    [1] => Array
                    (
                        [nid] => 2
                        [changed] => 1514034947
                        [title] => TITLE 2
                    )

                )
        )


     [1] => Array
       (
          [#theme] => pager
       )

最佳

【问题讨论】:

  • 你改变了原来的对象吗?
  • @user2486 一点
  • 第一次调试如 echo "
    "; print_r($array[0]['#items']);然后像 foreach( $array[0]['#items'] as $item )
    一样使用 foreach
  • 你也可以使用 count 像 $noofarray = count($array);在while循环中遍历所有元素,然后foreach。
  • 这个问题不清楚。你试过什么代码?这些数据究竟要做什么? #items 键是否存在于每个子数组中?请改进您的问题。

标签: php foreach


【解决方案1】:

假设数组结构与您在此处发布的完全一样,您可以进行试验。我不知道你想对每个项目做什么,所以这个例子只是打印出每个项目的元素:

foreach( $array as $outerarray )
{
    foreach( $outerarray['#items'] as $item ) 
    {
        echo "{$item['nid']} {$item['changed']} {$item['title']}\n";
    }
}

【讨论】:

  • @C_Miller 这仅适用于数组的第一项如果有多个失败...
  • 阿迪是对的。更新。最初只有一项,但问题已被编辑。
  • 这也引发了同样的问题,你必须使用嵌套数组或向量映射来处理相同的问题......或者这只会使用第一个项目。你需要将 $array[0]['#items'] 更改为喜欢$array[i]['#items']
  • 问题也是我不知道每个数组元素中是否会有一个#items。在他的例子中没有。如果是这种情况,则需要在循环中进行额外检查。
【解决方案2】:

您可以使用嵌套的foreach 来从此数组对象中获取最终的项目列表...

    foreach($data as $items_list)
    {
        foreach($items_list[#items] as $items)
        {
           // do something here....
        }
    }

【讨论】:

  • 哪种方式更快??
  • 必须有你想要的对象。如果您只有一次使用此项目,则使用直接映射,或者如果您想处理可以遵循的每个项目...
  • 是的,当然,直接映射比循环快得多,但不适用于多个项目...
  • 所以最后你的解决方案使用嵌套的 foreach 是吗?
  • 是的!取决于... 我只是试图解释您的需求并为您提供最佳解决方案。
【解决方案3】:

由于您的元素位于 3 个级别以下,因此您需要使用 foreach 三次,如下所示:

foreach($data as $items_list){
    foreach($items_list[#items] as $items){
        foreach($items as $val){
            echo $val['nid'];
        }
    }
}

您可以简单地每次计算数组并​​在 foreach 循环之前添加条件以检查是否存在进一步的数组。

就像你可以计算主数组并使用while循环添加条件,然后使用foreach,如下所示:

$count = 0;
while($count<count($array)){
    foreach($array[$count]['#items'] as $items ){
        foreach($items as $val){
            echo $val['nid'];
        }
    }
$count = $count+1;
}

在做任何事情之前,最好像下面这样调试多个数组:

echo "<pre>"; print_r($array); die;

【讨论】:

  • 这种方式更快,谢谢
  • 谢谢!请尝试一次,如果出现任何问题,请告诉我
  • 但是建议如果你想使用一个嵌套的比我的要快得多...因为循环的数量,而且如果你想遍历一个循环,每个循环总是更好的一个数组。
  • 在每次迭代中调用 count () 永远不会是最快的方法。
  • 是的,还有更多的解决方案,但我已经给出了我想到的那个。 @mickmackusa 先生,我知道你有很多,因为你有更好的经验。 Count() 仅用于在每次继续之前对数组进行计数,仅此而已。
猜你喜欢
  • 1970-01-01
  • 2019-02-12
  • 2020-12-04
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 2012-09-27
  • 1970-01-01
相关资源
最近更新 更多