Массив доступа, возвращаемый функцией в php


88

Я использую шаблонизатор, который вставляет код на мой сайт там, где я хочу.

Я написал функцию для проверки чего-то довольно простого:

myfunction() { return '($this->data["a"]["b"] ? true : false)'; }

Проблема в том, что $ this-> данные являются частными, и я не могу получить к ним доступ везде, поэтому мне приходится использовать getData (); что вызывает мою проблему.

$this->getData()['a']['b']

не работает, и присвоение значения первым тоже не работает, потому что оно будет использоваться непосредственно в блоке if ().

Любые идеи?


Назначение возвращаемого значения определенно работает, и это единственный способ. Можете показать нам свой нерабочий код?
— Anti Veeranna,

Это не работает, потому что код будет вставлен в if (/ * здесь код * /). Так что я не могу просто назначить данные раньше.
— enyo,

1
Что вы вообще строите? :) что-то с eval?
— Anti Veeranna,

Что вы пытаетесь проверить? Вы пытаетесь проверить, существует ли элемент массива и имеет ли оно непустое значение? Для этого вы можете использовать функцию «пустой». Этот вопрос требует большей ясности!
— txwikinger,

Как (было) это строковое значение, которое вы возвращаете, myfunction()обрабатывается дальше? Эта часть отсутствует в вашем вопросе.
— hakre

Ответы:


134

Начиная с PHP 5.4 это возможно:

getSomeArray()[2]

Ссылка: https://secure.php.net/manual/en/language.types.array.php#example-62

В PHP 5.3 или более ранних вам потребуется временная переменная.


4
У меня есть, PHP 5.4.11-1~precise+1но эта функция не работает! Получил сообщение в ответParse error: syntax error, unexpected '['
— Евгений

1
+ Евгений у тебя заработало? Возможно, другие сталкиваются с той же проблемой.
— enyo

2
Потребовалось до php 5.4, чтобы поддерживать нотацию массива, возвращаемую функциями ?! Какая неприятная ошибка.
— Василий Муса

А затем вы пытаетесь получить первый элемент массива, сгенерированного array_filter, и начинаете плакать
— Loupax

17

Нельзя использовать что-то вроде этого:

$this->getData()['a']['b']

т.е. синтаксис доступа к массиву не возможен непосредственно при вызове функции.

Вы должны использовать временную переменную , например:

$tmp = $this->getData();
$tmp['a']['b']    // use $tmp, now

В вашем случае это, вероятно, означает использование чего-то вроде этого:

function myfunction() {
  $tmp = $this->getData();
  return ($tmp['a']['b'] ? true : false);
}

Ты должен :

  • сначала вызовите свой getData()метод и сохраните его возвращаемое значение во временной переменной
  • затем используйте эту временную переменную для своего теста

На самом деле у вас нет особого выбора ...


Как я уже сказал, моя проблема в том, что этот код вставляется непосредственно в if (/ * здесь идет код * /), поэтому определение функции там на самом деле невозможно ...
— enyo

Можете ли вы не присвоить результат вызова метода переменной перед оператором if и использовать эту переменную в операторе if вместо того, чтобы напрямую пытаться вызвать метод из оператора if?
— Паскаль МАРТИН,

1
К сожалению, нет ... Это шаблонизатор, и я не могу его контролировать.
— enyo,

12

Хорошо ... видимо, лучшего способа действительно нет, поэтому я отвечу себе не очень красивым решением:

Я создал функцию:

arrayGet($array, $index) { return $array[$index]; }

И использовал это так:

myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' }

Это некрасиво, но работает.


1

$this->dataэто всегда доступен, если он защищен. недоступен отовсюду, поэтому, если вы возвращаете свой код, и он оценивается как таковой, все должно быть в порядке.$object->data$this

Кстати, в вашем коде есть ошибка: кавычки нужно экранировать.

myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }

Ага, извините ... Я поправил свой пост: $ this-> данные, конечно, частные. Также исправлена ​​моя опечатка при создании ошибки.
— enyo,

1

Это возможно с версии PHP 5.4.

Если вам не нужна временная переменная для этого и ваша версия PHP меньше, чем 5.4 , вы все равно можете использовать несколько встроенных функций для получения первого или последнего элемента:

$x     = 'first?last';
$first = array_shift(explode('?', $x));
$last  = end(explode('?', $x));
$last2 = array_pop(explode('?', $x));

Изменить: !!! Обратите внимание, что в более поздних версиях (5.4+) PHP выдает уведомление, потому что end ожидает только переменные в качестве параметра.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.