Matriz de acceso devuelta por una función en php

88

Estoy usando un motor de plantillas que inserta código en mi sitio donde lo quiero.

Escribí una función para probar algo que es bastante fácil:

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

El problema es que $ this-> data es privado y no puedo acceder a ellos en todas partes, así que tengo que usar getData (); que causa mi problema.

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

no funciona, y la asignación del valor primero tampoco porque se usará directamente en un bloque if ().

¿Algunas ideas?

enyo
fuente
Asignar el valor de retorno definitivamente funciona y es la única forma. ¿Puede mostrarnos su código que no funciona?
Anti Veeranna
Bueno, no funciona porque el código se insertará en un if (/ * código aquí * /). Entonces no puedo simplemente asignar los datos antes.
enyo
1
¿Qué diablos estás construyendo de todos modos? :) ¿algo con eval?
Anti Veeranna
¿Qué estás intentando comprobar? ¿Intenta ver si el elemento de la matriz existe y tiene un valor no vacío? Puede utilizar la función 'vacío' para esto. ¡Esta pregunta necesita más claridad!
txwikinger
¿Cómo se myfunction()procesa (fue) ese valor de cadena que devuelve ? Esa parte falta en tu pregunta.
hakre

Respuestas:

134

Desde PHP 5.4 es posible hacer exactamente eso:

getSomeArray()[2]

Referencia: https://secure.php.net/manual/en/language.types.array.php#example-62

En PHP 5.3 o anterior, necesitará usar una variable temporal.

enyo
fuente
4
¡Tengo PHP 5.4.11-1~precise+1y esta característica no funciona! Recibí un mensaje en respuestaParse error: syntax error, unexpected '['
Eugene
1
+ Eugene, ¿lo hiciste funcionar? Quizás otros experimenten el mismo problema.
enyo
2
¿Se necesitó hasta PHP 5.4 para admitir la notación de matriz devuelta por las funciones? Qué error tan desagradable.
Basil Musa
Y luego intentas obtener el primer elemento de una matriz generada por array_filter y comienzas a llorar
Loupax
17

No puedes usar algo como esto:

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

es decir, la sintaxis de acceso a matrices no es posible directamente en una llamada a función.

Tienes que usar alguna variable temporal , como esta:

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

En su caso, esto probablemente signifique usar algo como esto:

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

Tienes que :

  • primero, llame a su getData()método y almacene su valor de retorno en una variable temporal
  • luego, use esa variable temporal para su prueba

No tienes muchas opciones al respecto, en realidad ...

Pascal MARTIN
fuente
Bueno, como dije, mi problema es que este código se inserta directamente en if (/ * código va aquí * /) por lo que definir una función allí no es realmente posible ...
enyo
¿No puede asignar el resultado de la llamada al método a una variable antes de la instrucción if y usar esa variable en la instrucción if, en lugar de intentar llamar directamente al método desde la instrucción if?
Pascal MARTIN
1
Desafortunadamente no ... Este es un motor de plantillas y no tengo control sobre él.
enyo
12

Ok ... aparentemente no hay una mejor manera, así que voy a responderme con una solución no tan hermosa:

Creé la función:

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

Y lo usé así:

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

Esto no es bonito pero funciona.

enyo
fuente
1

$this->datasiempre es accesible, si está protegido. no es accesible desde todas partes, por lo que si regresa en su código y se evalúa como tal, debería estar bien.$object->data$this

Por cierto, hay un error en su código: las comillas deben escaparse.

myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }
fusión de almas
fuente
Sí, lo siento ... Corregí mi publicación: $ this-> los datos son privados, por supuesto. También se corrigió mi error tipográfico al crear el error.
enyo
1

Es posible a partir de la versión 5.4 de PHP.

Si no desea una variable temporal para eso y su versión de PHP es menor, que 5.4 , aún puede usar algunas funciones integradas para obtener el primer o el último elemento:

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

Editar: !!! Tenga en cuenta que en versiones posteriores (5.4+) PHP lanzará un aviso, porque end solo espera variables como parámetro.

Lajos Meszaros
fuente