Имя индекса динамического массива 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()