Как вывести массив

QuZ

Постоялец
Регистрация
18 Июл 2009
Сообщения
86
Реакции
50
Добрый вечер всем).
Имеется массив $row. Мне необходимо обратиться к определенному значению массива, передав ключи в виде массива.

Представлю небольшой код.

Код:
$key = array();
$key[0] = 'ATTRIBUTE';
$key[1] = 'POWER';
$mackros = '[@ID]';

if ($mackros == '[@ID]')
{
    $a = '$row';
    foreach ($key as $one_key)
    {
        $a .= "['$one_key']";
    }
    echo($a);

}

Код для примера, чтобы было нагляднее моя задача.
Суть задачи - не вывести в виде текста (echo($a); '$row['ATTRIBUTE']['POWER']')
А вывести значение данного ключа.. Посоветуйте пожалуйста, как это реализовать.
Спасибо.
 
Последнее редактирование:
PHP:
echo $row['ATTRIBUTE']['POWER'];
//или
echo $row[$key[0]][$key[1]]; //Хотя в таком виде ошибок наделать раз плюнуть

или заранее неизвестно какая будет вложенность?
 
PHP:
echo $row['ATTRIBUTE']['POWER'];
//или
echo $row[$key[0]][$key[1]]; //Хотя в таком виде ошибок наделать раз плюнуть

или заранее неизвестно какая будет вложенность?
Вы немного не так поняли меня.
Если я задаю адрес для обращения к массиву из переменных, как показал в скрипте, то у меня выводится просто как текст. $row['ATTRIBUTE']['POWER']; По сути в этом и кроется проблема. У меня в отдельном массиве хранятся ключи, по которым надо обратиться к элементу основного массива. Массив с ключами имеет вид - [0]=>[ATTRIBUTE]; [1]=> [POWER]; и т.д. Если я знал бы точно вложенность, то я бы при обращении к массиву передавал бы эти переменные в готовый шаблон ( $row['$atr_1']['$atr_2'] и т.д.) а не собирался бы путем добавления ключей. (.=)

Чуть расширю код.
Код:
$row[0]['ATTRIBUTE']['POWER']['value'] = 'Thx_one';
$row[0]['ATTRIBUTE']['STRONG']['value'] ='Thx_two';
$row[0]['FILTR']['POWER']['value'] ='Thx_three';
$row[0]['FILTR']['STRONG']['value'] ='Thx_four';
$key = array();
$key[0] = '0';
$key[1] = 'ATTRIBUTE';
$key[2] = 'POWER';
$key[3] = 'value';
$mackros = '[@ID]';

if ($mackros == '[@ID]')
{
    $a = '$row';
    foreach ($key as $one_key)
    {
        $a .= "['$one_key']";
    }
    echo($a);
// $row[0]['ATTRIBUTE']['POWER']['value'];

А должно выдавать - 'Thx_one';
}

Далее, я понимаю, что можно перебрать массив, сделать рекурсию и так перебрать весь массив $row по массиву $key[0] сначала, потом $key[1], $key[2] и т.д.
Но это решение слишком громоздко для данной задачи. Уверен, что где-то в кавычках у меня проблема...
 
Последнее редактирование:
Только циклов недостаточно, разве что через eval(), но это очень небезопасно.
Вот немного модифицированная функция из Yii2:

PHP:
<?php
$row[0]['ATTRIBUTE']['POWER']['value'] = 'Thx_one';
$row[0]['ATTRIBUTE']['STRONG']['value'] ='Thx_two';
$row[0]['FILTR']['POWER']['value'] ='Thx_three';
$row[0]['FILTR']['STRONG']['value'] ='Thx_four';
$key = array();
$key[0] = '0';
$key[1] = 'ATTRIBUTE';
$key[2] = 'POWER';
$key[3] = 'value';
$mackros = '[@ID]';

if ($mackros == '[@ID]')
{
    echo getValue($row, $key);
}

function getValue($array, $key, $default = null)
    {
        if (is_array($key)) {
            $lastKey = array_pop($key);
            foreach ($key as $keyPart) {
                $array = getValue($array, $keyPart);
            }
            $key = $lastKey;
        }
        if (is_array($array) && (isset($array[$key]) || array_key_exists($key, $array))) {
            return $array[$key];
        }
        if (($pos = strrpos($key, '.')) !== false) {
            $array = getValue($array, substr($key, 0, $pos), $default);
            $key = substr($key, $pos + 1);
        }
        if (is_array($array)) {
            return (isset($array[$key]) || array_key_exists($key, $array)) ? $array[$key] : $default;
        }
        return $default;
    }
 
Если я знал бы точно вложенность, то я бы при обращении к массиву передавал бы эти переменные в готовый шаблон ( $row['$atr_1']['$atr_2'] и т.д.) а не собирался бы путем добавления ключей. (.=)
Собираться надо не склейкой строк, а указателями :)
PHP:
<?php

$row[0]['ATTRIBUTE']['POWER']['value'] = 'Thx_one';
$row[0]['ATTRIBUTE']['STRONG']['value'] ='Thx_two';
$row[0]['FILTR']['POWER']['value'] ='Thx_three';
$row[0]['FILTR']['STRONG']['value'] ='Thx_four';
$key = array();
$key[0] = '0';
$key[1] = 'ATTRIBUTE';
$key[2] = 'POWER';
$key[3] = 'value';
$mackros = '[@ID]';

if ($mackros == '[@ID]')
{
    $a =& $row;
    foreach ($key as $one_key)
    {
        $a =& $a[$one_key];
    }
    echo($a);
}
 
  • Нравится
Реакции: QuZ
Собираться надо не склейкой строк, а указателями :)
PHP:
<?php

$row[0]['ATTRIBUTE']['POWER']['value'] = 'Thx_one';
$row[0]['ATTRIBUTE']['STRONG']['value'] ='Thx_two';
$row[0]['FILTR']['POWER']['value'] ='Thx_three';
$row[0]['FILTR']['STRONG']['value'] ='Thx_four';
$key = array();
$key[0] = '0';
$key[1] = 'ATTRIBUTE';
$key[2] = 'POWER';
$key[3] = 'value';
$mackros = '[@ID]';

if ($mackros == '[@ID]')
{
    $a =& $row;
    foreach ($key as $one_key)
    {
        $a =& $a[$one_key];
    }
    echo($a);
}

Вот, вот так оно и работает)) Думал только дело в кавычках, а оказывается и еще косяк был)))
Спасибо.

Только циклов недостаточно, разве что через eval(), но это очень небезопасно.
Вот немного модифицированная функция из Yii2:

PHP:
<?php
$row[0]['ATTRIBUTE']['POWER']['value'] = 'Thx_one';
$row[0]['ATTRIBUTE']['STRONG']['value'] ='Thx_two';
$row[0]['FILTR']['POWER']['value'] ='Thx_three';
$row[0]['FILTR']['STRONG']['value'] ='Thx_four';
$key = array();
$key[0] = '0';
$key[1] = 'ATTRIBUTE';
$key[2] = 'POWER';
$key[3] = 'value';
$mackros = '[@ID]';

if ($mackros == '[@ID]')
{
    echo getValue($row, $key);
}

function getValue($array, $key, $default = null)
    {
        if (is_array($key)) {
            $lastKey = array_pop($key);
            foreach ($key as $keyPart) {
                $array = getValue($array, $keyPart);
            }
            $key = $lastKey;
        }
        if (is_array($array) && (isset($array[$key]) || array_key_exists($key, $array))) {
            return $array[$key];
        }
        if (($pos = strrpos($key, '.')) !== false) {
            $array = getValue($array, substr($key, 0, $pos), $default);
            $key = substr($key, $pos + 1);
        }
        if (is_array($array)) {
            return (isset($array[$key]) || array_key_exists($key, $array)) ? $array[$key] : $default;
        }
        return $default;
    }

Спасибо тоже за помощь, не тестировал данного зверя, но в копилку однозначно.
 
Назад
Сверху