PHP, передать строку, содержащую ключи массива, чтобы найти значение массива - PullRequest
3 голосов
/ 28 июля 2011

долгое время читатель, первый раз вопрос-эр.

Я оказался в уникальной ситуации, и самый эффективный способ найти мою проблему - это создать строку ключей для получения значения. У меня возникли проблемы с отступом блока кода, поэтому я предоставил фрагмент кода в Pastebin: http://pastebin.com/Nn8xS5Vx

То, что я пытаюсь сделать, - это пройти через каждый уровень структуры, проверить каждый уровень на наличие ошибок и, если таковые имеются, сообщить о них обратно в $errors_array в следующем формате:

[Level eg:Enterprise]
  [0] Enterprise Name
[Platform]
  [0] Platform Name

Проблема в том, что я не иду вниз по уровням, когда извлекаю имя, он смотрит на корень массива. Моя идея заключалась в том, чтобы написать цикл for для создания строки, обеспечивающей текущий уровень, чтобы можно было получить имя.

Я собираюсь создать строку, содержащую ключи каждого уровня, а затем использовать эту строку ключей, чтобы обратиться к переменной $node и получить имя соответственно. Вот псевдо-пример:

$keyString = "[Enterprise][Platform][Offering]"

И тогда я бы использовал что-то с эффектом:

$node[$keystring]['name']

Надеюсь, я объяснил это достаточно хорошо. Если у кого-нибудь есть какие-либо предложения относительно того, как мне этого добиться, или даже о лучшем методе получения того же конечного результата, я был бы очень признателен.

Ответы [ 2 ]

1 голос
/ 28 июля 2011

Задумывались ли вы об использовании array_walk_recursive вместо этого?Я дам вам текущий ключ, и вы легко могли бы использовать глобальную переменную (может быть, грязную и плохую, но она должна работать), чтобы использовать ее в качестве стека для отслеживания ключей массива выше текущего значения.

1 голос
/ 28 июля 2011

Если я правильно понял вашу проблему, вы хотите получить значение во вложенном массиве по списку ключей. Есть несколько способов добиться этого. Вот пара:

// setup
$data = array(
    'foo' => array(
        'bar' => array(
            'baz' => array(
                'quux' => 'value'
            )
        )
    )
);

$search = array('foo', 'bar', 'baz', 'quux');

// Method 1 - search by reference:
$value = $data;

foreach ($search as $key) {
    if (is_array($value) && array_key_exists($key, $value)) {
        $value = &$value[$key]; // use the reference to chase down the array
    } else {
        // handle errors here
    }
}

var_dump($value); // 'value'


// Method 2 - search by recursion:
function getValue($value, array $keys) {
    if ($keys === array()) {
        return $value; // got to the end of the list of keys
    }

    $key = array_shift($keys);

    if (is_array($value) && array_key_exists($key, $value)) {
        return getValue($value[$key], $keys);
    }

    // handle errors here
}

var_dump(getValue($data, $search)); // 'value'

Я думаю, что это немного упрощает вашу проблему, но я надеюсь, что это поможет.

...