Переменные для ключа массива - PullRequest
0 голосов
/ 28 февраля 2019

В настоящее время я пытаюсь вызвать многомерный массив, используя строку в качестве ключа или ключей.Я хотел бы использовать следующий код, но я думаю, что ключ интерпретируется как строка.Любое решение?

$data= [];

$data['volvo'] = "nice whip";
$test = "['volvo']";

$data['drivers']['mike'] = "decent";
$test2 = "['drivers']['mike']";

echo $data$test;  // should read 'nice whip'
echo $data$test2; // should read 'decent'

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Проблема в том, что вы не можете пройти несколько уровней в одной строке.(Если это так, PHP должен будет начать поиск фрагментов кода внутри ключей строкового массива. И как он узнает, следует ли интерпретировать их как фрагменты, а затем разделить строковый ключ или продолжать обрабатывать его как одну строку ??)

Alt 1

Одно из решений - изменить структуру $data и сделать ее одноуровневым массивом.Затем вы предоставляете ключи для всех уровней, необходимых для поиска ваших данных, , объединенных в строку .Конечно, вам нужно найти разделитель, который работает в вашем случае.Если ключи представляют собой простые строки, то что-то простое, например подчеркивание, должно работать нормально.Кроме того, это не изменит структуру вашей базы данных, только способ хранения данных.

function getDbItem($keys) {
    // Use this to get the "old version" of the key back. (I.e it's the same data)
    $joinedKey = "['".implode("'],['", $keys)."']";

    $joinedKey = implode('_', $keys);
    return $data[$joinedKey];
}

// Example
$data = [
    'volvo' => 'nice whip',
    'drivers_mike' => 'decent'
];
var_dump(getDbItem(['drivers', 'mike'])); // string(6) "decent"

Alt 2

Другой способ - не изменять количество уровней в $data, но просто проследуйте по нему, используя переданные ключи:

$tgt = $data;
foreach($keys as $key) {
    if (array_key_exists($key, $tgt)) {
        $tgt = $tgt[$key];
    }
    else {
        // Non existing key. Handle properly.
    }
}

// Example
$keys = ['drivers', 'mike'];
// run the above code
var_dump($tgt); // string(6) "decent"
0 голосов
/ 28 февраля 2019

Если вам нужно решение для доступа к динамическому массиву, вы также можете написать функцию, которая обеспечивает фактический доступ к массиву следующим образом:

function path($array, $path) {
    $path = is_array($path) ? $path : explode('.', $path);
    $current = $array;
    while (count($path)) {
        $seg = array_shift($path);
        if (!isset($current[$seg])) throw new Exception('Invalid path segment: ' . $seg);
        $current = $current[$seg];
    }
    return $current;
}

В вашем случае это будет выглядеть так:

 echo path($data, 'volvo');
 echo path($data, 'drivers.mike');

или

 echo path($data, ['volvo']);
 echo path($data, ['drivers', 'mike']);
0 голосов
/ 28 февраля 2019

Вы просто используете переменную (которая должна быть просто строкой, а не синтаксисом PHP) вместо строкового литерала.

$cars = [];
$cars['volvo'] = 'nice whip';
$test = 'volvo';
echo $cars[$test];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...