Имя индекса динамического массива PHP
Я хочу передать функцию значение индекса массива - например ['client_name] - значение первого уровня работает, потому что я могу сделать
$index = client_name;
function arraything ($index) { return $this->arraytolookat[$index]; }
Вопрос в том, как это сделать, если это многоядерный массив?
Я попробовал выражение eval и, видимо, он не оценивает скобки хорошо... Поэтому я пробовал это.
$index = "[0][‘client_name’]";
Eval("$this->arraytolookat$index");
Но это просто терпит неудачу... крылатые о неожиданном [- любые идеи?
EDIT: я не знаю, сколько уровней этой функции может потребоваться для входа, поэтому я не могу просто добавить в скобки определенное количество скобок. Это не так просто, как выглядит ^^
EDIT 2: В основном - я написал инструмент проверки формы, и одна из функций возвращает правильные данные post - мне нужен простой метод, когда при вводе имени элемента формы он будет буквально возвращать данные POST обратно элемент, например getFormData ( "client_name" ) - однако, когда форма становится более сложной, она может перейти в массивы, мне нужно подготовиться к возможности getFormData ( "['$ i'] client_name" ) или somthing вдоль этих строк, вещи происходят с postdata в этом классе, поэтому функция должна использоваться. Я просто хочу, чтобы эта функция принимала строку, а не массив.
Ответы
Ответ 1
Вы можете передать массив индексов этой функции ниже. Поэтому, если вы хотите получить $some_array[0]['client_name']['third_level_index']
, вы можете сделать это:
function get_array_value(array $array, array $indexes)
{
if (count($array) == 0 || count($indexes) == 0) {
return false;
}
$index = array_shift($indexes);
if(!array_key_exists($index, $array)){
return false;
}
$value = $array[$index];
if (count($indexes) == 0) {
return $value;
}
if(!is_array($value)) {
return false;
}
return get_array_value($value, $indexes);
}
$some_array = array(/* nested array */);
$indexes = array(0, 'client_name', 'third_level_index');
$value = get_array_value($some_array, $indexes);
Ответ 2
function arraything ($arrayOfIndexes) {
$current = $this->array;
foreach ($arrayOfIndexes as $curIndex) {
$current = $current[$curIndex];
}
return $current;
}
$x = arraything (array(0, 'client_thing'));
Нет проверки (например, для отсутствующих ключей), но идея должна быть ясной.
Ответ 3
Функция get_array_value работает хорошо. Поэтому я также написал функцию set_array_value.
Вот он:
function get_array_value($array, $indexes)
{
if (count($indexes) == 1)
{
return $array[$indexes[0]];
}
$index = array_shift($indexes);
return get_array_value($array[$index], $indexes);
}
function set_array_value(&$array, $indexes, &$value)
{
if (count($indexes) == 1)
{
return $array[reset($indexes)] = $value;
}
$index = array_shift($indexes);
return set_array_value($array[$index], $indexes, $value);
}
$some_array = array();
$some_array[0]['client_name']['id'] = 1;
$some_array[1]['client_name']['id'] = 2;
$indexes = array(0, 'client_name', 'id');
$value = get_array_value($some_array, $indexes);
print_r($value);
$id = 23;
set_array_value($some_array, $indexes, $id);
$value = get_array_value($some_array, $indexes);
print_r($value);
Надеюсь, что это поможет: -)
: Nirav
Ответ 4
$first = arraything(0);
echo $first['client_name'];
Похоже, вы пытаетесь слишком сильно перегрузить этот аргумент. Можно ли его переписать, чтобы сделать это более аккуратно? Вы можете вернуть это прямо...
$this->arraytolookat[0]['client_name'];
В некоторых структурах есть вспомогательная функция для доступа к элементам массива с оператором, например .
(в строке, конечно).
Ответ 5
попробовал цикл foreach, я не уверен, что это лучшее решение. что-то вроде этого
foreach($array as $key => $value){
arraything ($key);
}
или используйте функцию array_keys()