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

88

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

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

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

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

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

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

Любые идеи?

Enyo
источник
Назначение возвращаемого значения определенно работает, и это единственный способ. Можете показать нам свой нерабочий код?
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 или более ранних вам потребуется временная переменная.

Enyo
источник
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)' }

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

Enyo
источник
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 ожидает только переменные в качестве параметра.

Лайош Месарош
источник