todas predefinidas parametros otro manejo llamar las funciones funcion etiquetas desde php arrays syntax function

predefinidas - todas las etiquetas de php



Sintaxis de PHP para el resultado de la funciĆ³n de desreferenciaciĆ³n (22)

¿Esto funciona?

return ($foo->getBarArray())[0];

De lo contrario, ¿puedes publicar la función getBarArray ()? No veo por qué eso no funcionaría de lo que publicaste hasta ahora.

Fondo

En todos los demás lenguajes de programación que utilizo regularmente, es simple operar en el valor de retorno de una función sin declarar una nueva variable para mantener el resultado de la función.

En PHP, sin embargo, esto no parece ser tan simple:

example1 (el resultado de la función es una matriz)

<?php function foobar(){ return preg_split(''//s+/'', ''zero one two three four five''); } // can php say "zero"? /// print( foobar()[0] ); /// <-- nope /// print( &foobar()[0] ); /// <-- nope /// print( &foobar()->[0] ); /// <-- nope /// print( "${foobar()}[0]" ); /// <-- nope ?>

ejemplo2 (el resultado de la función es un objeto)

<?php function zoobar(){ // NOTE: casting (object) Array() has other problems in PHP // see e.g., http://stackoverflow.com/questions/1869812 $vout = (object) Array(''0''=>''zero'',''fname''=>''homer'',''lname''=>''simpson'',); return $vout; } // can php say "zero"? // print zoobar()->0; // <- nope (parse error) // print zoobar()->{0}; // <- nope // print zoobar()->{''0''}; // <- nope // $vtemp = zoobar(); // does using a variable help? // print $vtemp->{0}; // <- nope

¿Alguien puede sugerir cómo hacer esto en PHP?


Anteriormente en PHP 5.3 tenías que hacer esto:

function returnArray() { return array(1, 2, 3); } $tmp = returnArray(); $ssecondElement = $tmp[1];

Resultado: 2

A partir de PHP 5.4, es posible desreferenciar una matriz de la siguiente manera:

function returnArray() { return array(1, 2, 3); } $secondElement = returnArray()[1];

Resultado: 2

A partir de PHP 5.5:

Incluso puedes ser inteligente:

echo [1, 2, 3][1];

Resultado: 2

También puede hacer lo mismo con cadenas. Se llama desreferenciación de cadenas:

echo ''PHP''[1];

Resultado: H


Bueno, puedes usar cualquiera de las siguientes soluciones, dependiendo de la situación:

function foo() { return array("foo","bar","foobar","barfoo","tofu"); } echo(array_shift(foo())); // prints "foo" echo(array_pop(foo())); // prints "tofu"

O puede tomar valores específicos de la matriz devuelta usando list () :

list($foo, $bar) = foo(); echo($foo); // prints "foo" echo($bar); // print "bar"

Editar: el código de ejemplo para cada () que di antes era incorrecto. each () devuelve un par clave-valor. Por lo tanto, podría ser más fácil usar foreach () :

foreach(foo() as $key=>$val) { echo($val); }


Como otros han mencionado, esto no es posible. La sintaxis de PHP no lo permite. Sin embargo, tengo una sugerencia que ataca el problema desde la otra dirección.

Si tiene el control del método getBarArray y tiene acceso a la biblioteca estándar de PHP (instalada en muchos hosts PHP 5.2.X e instalada por defecto con PHP 5.3), debería considerar devolver un ArrayObject lugar de una matriz / colección nativa de PHP. ArrayObjects tiene un método offetGet , que se puede usar para recuperar cualquier índice, por lo que su código puede parecerse a algo

<?php class Example { function getBarArray() { $array = new ArrayObject(); $array[] = ''uno''; $array->append(''dos''); $array->append(''tres''); return $array; } } $foo = new Example(); $value = $foo->getBarArray()->offsetGet(2);

Y si alguna vez necesita una matriz / colección nativa, siempre puede lanzar los resultados.

//if you need $array = (array) $foo->getBarArray();


Desafortunadamente, no hay forma de hacerlo, aunque sí en la mayoría de los otros lenguajes de programación.

Si realmente quisiera hacer un trazador de líneas, podría hacer una función llamada a () y hacer algo como

$test = a(func(), 1); // second parameter is the key.

Pero aparte de eso, func () [1] no es compatible con PHP.



En realidad, he escrito una biblioteca que permite dicho comportamiento:

http://code.google.com/p/php-preparser/

Funciona con todo: funciones, métodos. Caches, por lo que es tan rápido como PHP en sí :)


Escribe una función de envoltura que logre lo mismo. Debido al fácil moldeado de PHP, puede ser bastante abierto:

function array_value ($array, $key) { return $array[$key]; }


Estas son algunas formas de abordar su problema.

Primero, podría usar para nombrar variables directamente si devuelve una matriz de variables que no son parte de la colección, sino que tienen un significado diferente cada una.

Otras dos formas son para devolver el resultado que es una colección de valores.

function test() { return array(1, 2); } list($a, $b) = test(); echo "This should be 2: $b/n"; function test2() { return new ArrayObject(array(''a'' => 1, ''b'' => 2), ArrayObject::ARRAY_AS_PROPS); } $tmp2 = test2(); echo "This should be 2: $tmp2->b/n"; function test3() { return (object) array(''a'' => 1, ''b'' => 2); } $tmp3 = test3(); echo "This should be 2: $tmp3->b/n";


Esto es demasiado descabellado, pero si realmente NECESITA que esté en una línea:

return index0( $foo->getBarArray() ); /* ... */ function index0( $some_array ) { return $some_array[0]; }


Esto es específicamente eliminación de referencias de matriz, que actualmente no está soportado en php5.3 pero debería ser posible en la próxima versión, 5.4. La desreferenciación de objetos es posible en las versiones actuales de php. ¡También estoy esperando esta funcionalidad!


Extremadamente gueto, pero se puede hacer usando solo PHP. Esto utiliza una función lambda (que se introdujo en PHP 5.3). Ver y sorprenderse (y, ejem, aterrorizado):

function foo() { return array( ''bar'' => ''baz'', ''foo'' => ''bar'', } // prints ''baz'' echo call_user_func_array(function($a,$k) { return $a[$k]; }, array(foo(),''bar''));

Las longitudes que tenemos que pasar para hacer algo tan hermoso en la mayoría de los otros idiomas.

Para el registro, hago algo similar a lo que hace Nolte. Lo siento si hice sangrar a alguien.


Hay tres formas de hacer lo mismo:

  1. Como dice Chacha102, use una función para devolver el valor del índice:

    function get($from, $id){ return $from[$id]; }

    Entonces, puedes usar:

    get($foo->getBarArray(),0);

    para obtener el primer elemento, etc.

  2. Una forma perezosa usando current y array_slice:

    $first = current(array_slice($foo->getBarArray(),0,1)); $second = current(array_slice($foo->getBarArray(),1,1));

  3. Usando la misma función para devolver ambos, la matriz y el valor:

    class FooClass { function getBarArray($id = NULL) { $array = array(); // Do something to get $array contents if(is_null($id)) return $array; else return $array[$id]; } }

    Luego puede obtener la matriz completa y un solo elemento de la matriz.

    $array = $foo->getBarArray();

    o

    $first_item = $foo->getBarArray(0);


No puede encadenar expresiones como esa en PHP, por lo que deberá guardar el resultado de array_test() en una variable.

Prueba esto:

function array_test() { return array(0, 1, 2); } $array = array_test(); echo $array[0];


PHP no puede acceder a los resultados de la matriz desde una función. Algunas personas llaman a esto un problema, algunos simplemente aceptan esto como el diseño del idioma. Entonces, PHP hace que cree variables no esenciales solo para extraer los datos que necesita.

Entonces tienes que hacer

$var = foobar(); print($var[0]);


Por supuesto, podría devolver un objeto en lugar de una matriz y acceder de esta manera:

echo "This should be 2: " . test()->b ."/n";

Pero no encontré la posibilidad de hacer esto con una matriz :(


Puedes usar referencias:

$ref =& myFunc(); echo $ref[''foo''];

De esa forma, realmente no está creando un duplicado de la matriz devuelta.


Si es solo estético, la notación Objeto funcionará si devuelves un objeto. En lo que respecta a la gestión de memoria, no se realiza una copia temporal, solo un cambio en la referencia.



mi solución habitual es tener una función genérica como esta

function e($a, $key, $def = null) { return isset($a[$key]) ? $a[$key] : $def; }

y entonces

echo e(someFunc(), ''key'');

como beneficio adicional, esto también evita la advertencia de ''índice indefinido'' cuando no la necesita.

En cuanto a las razones por las cuales foo()[x] no funciona, la respuesta es bastante descortés y no se publicará aquí. ;)


Array Dereferencing es posible a partir de PHP 5.4:

Ejemplo ( source ):

function foo() { return array(1, 2, 3); } echo foo()[2]; // prints 3

con PHP 5.3 obtendrías

Parse error: syntax error, unexpected ''['', expecting '','' or '';''

Respuesta Original:

Esto ya se been preguntado before . La respuesta es no. No es posible.

Para quote Andi Gutmans sobre este tema:

Esta es una solicitud de función bien conocida, pero no será compatible con PHP 5.0. No puedo decirte si alguna vez será compatible. Requiere un poco de investigación y mucho pensamiento.

También puede encontrar esta request varias veces en el Bugtracker de PHP. Para obtener detalles técnicos, le sugiero que consulte el RFC oficial y / o pregunte en PHP Internals .


Respuesta corta:

Sí. Es posible operar en el valor de retorno de una función en PHP, siempre y cuando el resultado de la función y su versión particular de PHP lo admitan.

Hacer referencia al ejemplo2:

// can php say "homer"? // print zoobar()->fname; // homer <-- yup

Casos:

  • El resultado de la función es una matriz y tu versión de PHP es lo suficientemente reciente
  • El resultado de la función es un objeto y el miembro de objeto que desea es alcanzable