Я работаю над программой, которая использует указатели внутреннего массива PHP для итерации по многомерному массиву. Мне нужно получить элемент из текущей строки, и я делал это так:
$arr[key($arr)]['item']
Однако я бы предпочел использовать что-то вроде:
current($arr)['item'] // invalid syntax
Я надеюсь, что есть функция, которую я пропустил при просмотре документации, которая позволит мне получить доступ к элементу следующим образом:
getvalue(current($arr), 'item')
или же
current($arr)->getvalue('item')
Какие-либо предложения?
Подход getvalue был бы полезен даже для одномерных массивов. Это позволило бы обойти ограничения синтаксиса ≤5.3 и разрешить доступ к элементу из массива, скажем, возвращенному вызовом функции, непосредственно в одном операторе. Мне не хватает такой внутренней функции.






Я очень сомневаюсь, что такая функция есть, но написать тривиально
function getvalue($array, $key)
{
return $array[$key];
}
Обновлено: Начиная с PHP 5.4, вы можете индексировать элементы массива непосредственно из функциональных выражений current($arr)['item'].
Я думаю, что, наверное, этим и займусь. Если вы правы, что такой функции нет, это довольно плохая оплошность.
Вы уже пробовали использовать один из классы итераторов? Там может быть что-то, что делает именно то, что вы хотите. В противном случае вы, вероятно, сможете получить то, что хотите, расширив класс ArrayObject.
Просто взглянул на них - похоже, что это просто объектно-ориентированный способ перебора массива. ArrayIterator :: current возвращает текущий элемент почти так же, как функция current (), что на самом деле не является моей проблемой.
Если это не сработает, как составлен ваш многомерный массив? Может помочь var_dump ().
$subkey = 'B';
$arr = array(
$subkey => array(
'AB' => 'A1',
'AC' => 'A2'
)
);
echo current($arr[$subkey]);
next($arr[$subkey]);
echo current($arr[$subkey]);
Итерация, которую я выполняю, на самом деле выполняется только по первичному массиву. Я сказал «многомерный», потому что соответствующие элементы основного массива сами по себе являются массивами, но я не хочу перебирать их - я просто хочу получить к ним удобный доступ.
Как насчет обработки $ arr [$ subkey] как массива или $ new_arr = array_values ($ arr [$ subkey])? Сноска: чем отличается запрошенный текущий ($ arr) ['item'] и текущий ($ arr ['item'])?
Я часто использую
foreach ($arr as $key=>$val) {
$val['item'] /*$val is the value of the array*/
$key /*$key is the key used */
}
вместо
следующий ($ arr) / текущий ($ arr)
Я тоже использую это - ради вопроса я исключил тот факт, что на самом деле я просматриваю два отсортированных массива в поисках различий, и я почти уверен, что foreach не поддерживает такой доступ, но я могу ошибаться . В любом случае, спасибо за ответ. :)
Эта функция может быть немного длинноватой, но я использую ее постоянно, особенно в таких сценариях, как:
if (array_key_exists('user', $_SESSION) === true)
{
if (array_key_exists('level', $_SESSION['user']) === true)
{
$value = $_SESSION['user']['level'];
}
else
{
$value = 'DEFAULT VALUE IF NOT EXISTS';
}
}
else
{
$value = 'DEFAULT VALUE IF NOT EXISTS';
}
Обращается к этому:
Value($_SESSION, array('user', 'level'), 'DEFAULT VALUE IF NOT EXISTS');
Вот функция:
function Value($array, $key = 0, $default = false)
{
if (is_array($array) === true)
{
if (is_array($key) === true)
{
foreach ($key as $value)
{
if (array_key_exists($value, $array) === true)
{
$array = $array[$value];
}
else
{
return $default;
}
}
return $array;
}
else if (array_key_exists($key, $array) === true)
{
return $array[$key];
}
}
return $default;
}
PS: Вы также можете использовать одномерные массивы, например:
Value($_SERVER, 'REQUEST_METHOD', 'DEFAULT VALUE IF NOT EXISTS');
Вы уже нашли лучшее решение: $ arr [key ($ arr)] ['item']