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

Некоторые фреймворки имеют вспомогательную функцию для доступа к членам массива с помощью оператора, такого как . (в строке конечно).

Другие вопросы по тегам