使用PHP循环到多维数组

时间:2018-01-09 05:19:27

标签: php arrays

我有这个阵列:

Array
(
    [0] => Array
        (
            [name] => System
            [order] => 1
            [icon] => stats.svg
            [0] => Array
                (
                    [title] => Multilingual
                )

            [1] => Array
                (
                    [title] => Coloring
                )

            [2] => Array
                (
                    [title] => Team work
                )

            [3] => Array
                (
                    [title] => Tutorials
                )

        )
)

我想循环到这里以显示部分名称以及包含在以下数组中的所有功能。

所以,这就是我所做的:

foreach ($features as $feature => $info) {
    echo '
        '.$info['name'].'
                <ul class="menu-vertical bullets">
    ';

                foreach (array_values($info) as $i => $key) {
                    echo '
                        <li>'.$key['title'].'</li>
                    ';
                }

    echo '
                </ul>
    ';
}

除了前三分之一<li>之外,我的第一个字符为nameordericon值。

你知道为什么吗?

感谢。

3 个答案:

答案 0 :(得分:0)

在php中,array_values表示数组的所有值。因此array_values($info)array($info['name'], $info['order'], $info['icon'], $info[0], $info[1], $info[2], $info[3])

在您的示例中,您可以跳过$info的非整数键来获取标题:

<?php
$features = array();
$info = array();
$info['name'] = 'System';
$info['order'] = 1;
$info['icon'] = 'stats.svg';
$info[] = array('title'=>'Multilingual');
$info[] = array('title'=>'Coloring');
$features[] = $info;

foreach ($features as $feature => $info) {
    echo $info['name'] . PHP_EOL;
    echo '<ul class="menu-vertical bullets">' . PHP_EOL;
    foreach ($info as $k => $item) {
        if(!is_int($k)) continue;
        echo '<li>' . $item['title'] . '</li>' . PHP_EOL;
    }
    echo '</ul>' . PHP_EOL;
}

但是,您的原始数据结构设计不合理且难以使用。为了更好的设计,您可以考虑以下代码,将项目移动到$info的子数组:

<?php
$features = array();
$info = array();
$info['name'] = 'System';
$info['order'] = 1;
$info['icon'] = 'stats.svg';
$info['items'] = array();
$info['items'][] = array('title'=>'Multilingual');
$info['items'][] = array('title'=>'Coloring');
$features[] = $info;

foreach ($features as $feature => $info) {
    echo $info['name'] . PHP_EOL;
    echo '<ul class="menu-vertical bullets">' . PHP_EOL;
    foreach ($info['items'] as $item) {
        echo '<li>' . $item['title'] . '</li>' . PHP_EOL;
    }
    echo '</ul>' . PHP_EOL;
}

两个演示的示例输出:

System
<ul class="menu-vertical bullets">
<li>Multilingual</li>
<li>Coloring</li>
</ul>
  

除了第一个第三个li之外,它有效,我有名字,顺序和图标值的第一个字符。你知道为什么吗?

为什么你会看到'name','order','icon'值的第一个字符?让我们看看PHP是如何工作的。

以第一个循环为例:foreach (array_values($info) as $i => $key)

然后$i == 0, $key == 'System'

我们知道$key[0] == 'S', $key[1] == 'y', $key[2] == 's'等等。

然后您尝试访问$key['title'],但字符串'title'无效作为字符串偏移量,因此它被PHP转换为整数:intval('title') == 0

然后$key['title'] == $key[intval('title')] == 'S'

这就是你所看到的。

答案 1 :(得分:0)

array_values返回数组的值,因此对于信息值,名称,顺序,图标,0,1,......

如果您只想要可以使用的打印标题,那么您的价值观是错误的:

foreach ($features as $feature => $info) {

    echo '
        '.$info['name'].'
            <ul class="menu-vertical bullets">
    ';
    //Remove some keys from info array
    $removeKeys = array('name', 'order', 'icon');
    $arr = $info;
    foreach($removeKeys as $key) {
       unset($arr[$key]);
    }

    foreach (array_values($arr) as $i => $key) {
                echo '
                    <li>'.$key['title'].'</li>
                ';
            }

    echo '
            </ul>
    ';
}

答案 2 :(得分:0)

array_value()返回数组的值,在这里你将获得数组$ info的值,而我所理解的并不是你需要的。查看array_value()的详细信息。

您可以检查$ info的键是否为整数。如果是,请回复标题。试一试。

foreach ($features as $feature => $info) {
    echo $info['name'].'<ul class="menu-vertical bullets">';
    foreach ($info as $key => $value) {
        if (is_int($key)) {
            echo '<li>'.$key['title'].'</li>';  
        }
    }
    echo '</ul>';
}