Foreach не работает - PHP - PullRequest
       5

Foreach не работает - PHP

2 голосов
/ 08 февраля 2012

Мне нужно напечатать приведенную ниже структуру массива как:

Node Title 1

  topic 1

  topic 2

  topic 3

  topic 4

    asset title1 

    asset title2

    asset title3

Как я могу использовать foreach - PHP

То, что я сделал, это:

foreach($output['fields'] as $key => $value) {
        if($key == 'title') {
            echo $value;
        }
        if(count($value['main_topic'])) {
            foreach($value['main_topic'] AS $mainkey => $main_topic) {
                echo $main_topic['topic_title'];
            }
        }
    }

Приведенный выше синтаксис печатает заголовок. Но не массив main_topic.

Array
(
    [fields] => Array
        (
            [nid] => 136
            [node_title] => Node title 1
            [node_type] => curriculum
            [title] => Node title 1
            [main_topic] => Array
                (
                    [0] => Array
                        (
                            [row_id] => 136
                            [topic_id] => 411847
                            [weight] => 10
                            [topic_title] => topic 1
                        )

                    [1] => Array
                        (
                            [row_id] => 136
                            [topic_id] => 411839
                            [weight] => 2
                            [topic_title] => topic 2
                        )

                    [2] => Array
                        (
                            [row_id] => 136
                            [topic_id] => 411840
                            [weight] => 3
                            [topic_title] => topic 3
                        )

                    [3] => Array
                        (
                            [row_id] => 136
                            [topic_id] => 411841
                            [weight] => 4
                            [topic_title] => topic 4
                            [subfield] => Array
                                (
                                    [1] => Array
                                        (
                                            [asset_title] => asset title 1
                                        )

                                    [2] => Array
                                        (
                                            [asset_title] => asset title 2
                                        )

                                    [3] => Array
                                        (
                                            [asset_title] => asset title 3
                                        )

                                )

                        )


                )

        )

)

Ответы [ 4 ]

3 голосов
/ 08 февраля 2012

Это потому что вы перебираете все $output['fields']. Никогда не будет $value с ключом 'main_topic', потому что ключ 'main_topic' содержится в массиве $output['fields'] и, таким образом, существует только как $key в вашем foreach. Массив, который вы хотите, это $value

Ваш код должен быть таким:

foreach($output['fields'] as $key => $value) {
        if($key == 'title') {
            echo $value;
            continue;
        }
        if($key == 'main_topic' && is_array($value)) {
            foreach($value as $main_topic) {
                echo $main_topic['topic_title'];
            }
        }
    }

Чтобы завершить этот ответ полным решением (включая названия активов), ниже я бы написал его.

Поскольку $output['fields'] является отправной точкой и для того, чтобы сделать код более читабельным, я создаю ссылку на начальный узел с помощью оператора =&, чтобы массив не копировался в память. Я делаю то же самое с внутренними foreach с. Поскольку мы не изменяем данные, ссылки на переменные достаточны и занимают меньше памяти и ЦП:

if (is_array($output['fields'])) {
    $node =& $output['fields'];
    echo $node['title'];
    if(is_array($node['main_topic'])) {
        foreach($node['main_topic'] as &$main) {
            echo $main['topic_title'];
            if(is_array($main['subfield'])) {
                foreach($main['subfield'] as &$asset) {
                    echo $asset['asset_title'];
                }
            }
        }
    } 
}
else {
    echo "no menu";
}
1 голос
/ 08 февраля 2012

$value - это массив, а не $key['main_topic']

foreach($output['fields'] as $key => $value) {
    if($key == 'title') {
        echo $value;
    }
    if($key == 'main_topic') {
        foreach($value as $mainkey => $main_topic) {
            echo $main_topic['topic_title'];
        }
    }
}
0 голосов
/ 08 февраля 2012

Вы путаете разделы массива.

Попробуйте (и я не проверял это):

echo $output['node_title']."\n";
foreach ($output['fields'] as $key=>$value)
{
    switch ($key)
    {
        case 'title':
            echo $value."\n";
            break;
        case 'main_topic':
            if (count($value) > 0)
            {
                foreach ($value as $main_block)
                {
                    echo "\t".$main_block['topic_title']."\n";
                    if (array_key_exists('subfield',$main_block)!==FALSE)
                    {
                        foreach ($main_block['subfield'] as $subfield_block)
                        {
                            echo "\t\t".$subfield_block['asset_title']."\n";
                        }
                    }
                }
            }
            break;
        default:
            break;
    }
}
0 голосов
/ 08 февраля 2012

Попробуйте, вам нужен дополнительный ключ:

echo $value['main_topic'][$mainkey]['topic_title'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...