Имя индекса динамического массива PHP
Я хочу передать функции значение индекса массива - например, ['client_name'] - значение первого уровня работает, потому что я могу сделать
$index = client_name;
function arraything ($index) { return $this->arraytolookat[$index]; }
Вопрос в том... как мне это сделать, если это многоуровневый массив?
Я попробовал eval-выражение, и, видимо, оно плохо оценивает скобки... Так что я попробовал это.
$index = “[0][‘client_name’]”;
Eval(“$this->arraytolookat$index”);
Но это просто терпит неудачу... о неожиданности [ - есть идеи?
РЕДАКТИРОВАТЬ: я не знаю, сколько уровней может потребоваться эта функция для перехода, поэтому я не могу просто добавить определенное количество скобок в конце. Это не так просто, как кажется ^^
РЕДАКТИРОВАТЬ 2: В основном - я написал инструмент проверки формы, и одна из функций возвращает правильные данные публикации - я хотел простой метод, который при вводе имени элемента формы - буквально возвращал бы данные POST обратно в элемент, например getFormData("client_name") - однако, когда форма становится более сложной, она может перейти в массивы, мне нужно подготовиться к возможности getFormData("['$i']client_name") или что-то в этом духе, с вещами случается постданные в этом классе, так что эта функция должна быть использована. Я просто хочу, чтобы эта функция принимала строку, а не массив.
5 ответов
Вы можете передать массив индексов этой функции ниже. Так что если вы хотите получить $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);
function arraything ($arrayOfIndexes) {
$current = $this->array;
foreach ($arrayOfIndexes as $curIndex) {
$current = $current[$curIndex];
}
return $current;
}
$x = arraything (array(0, 'client_thing'));
Проверка отсутствует (например, для отсутствующих ключей), но идея должна быть ясной.
Функция 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
Я пробовал цикл foreach, я не уверен, что это лучшее решение. идет примерно так
foreach($array as $key => $value){
arraything ($key);
}
или используйте array_keys()
функция
$first = arraything(0);
echo $first['client_name'];
Похоже, вы пытаетесь слишком перегружать этот аргумент. Можно ли это переписать, чтобы сделать это аккуратнее? Вы можете вернуть это напрямую...
$this->arraytolookat[0]['client_name'];
Некоторые фреймворки имеют вспомогательную функцию для доступа к членам массива с помощью оператора, такого как .
(в строке конечно).