Array di accesso restituito da una funzione in php


88

Sto utilizzando un motore di modelli che inserisce il codice nel mio sito dove lo desidero.

Ho scritto una funzione per testare qualcosa che è abbastanza semplice:

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

Il problema è che $ this-> data è privato e non posso accedervi ovunque, quindi devo usare getData (); che causa il mio problema.

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

non funziona, e nemmeno l'assegnazione del valore per primo, perché verrà utilizzato direttamente in un blocco if ().

Qualche idea?


Assegnare il valore di ritorno sicuramente funziona ed è l'unico modo. Puoi mostrarci il tuo codice non funzionante?
Anti Veeranna

Ebbene non funziona perché il codice verrà inserito in un if (/ * code here * /). Quindi non posso semplicemente assegnare i dati prima.
enyo

1
Cosa diavolo stai costruendo comunque? :) qualcosa con eval?
Anti Veeranna

Cosa stai cercando di controllare? Cerchi di vedere se l'elemento dell'array esiste e ha un valore non vuoto? È possibile utilizzare la funzione "vuoto" per questo. Questa domanda ha bisogno di più chiarezza!
txwikinger

In che modo è stato myfunction()elaborato ulteriormente il valore di stringa restituito ? Quella parte manca nella tua domanda.
hakre

Risposte:


134

Da PHP 5.4 è possibile fare esattamente questo:

getSomeArray()[2]

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

In PHP 5.3 o versioni precedenti, dovrai utilizzare una variabile temporanea.


4
Ho PHP 5.4.11-1~precise+1e questa funzione non funziona! Ho ricevuto un messaggio in rispostaParse error: syntax error, unexpected '['
Eugene

1
+ Eugene l'hai fatto funzionare? Forse altri sperimentano lo stesso problema.
enyo

2
Ci è voluto fino a php 5.4 per supportare la notazione di array restituita dalle funzioni ?! Che brutto insetto.
Basil Musa

E poi provi a ottenere il primo elemento di un array generato da array_filter e inizi a piangere
Loupax

17

Non puoi usare qualcosa di simile:

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

cioè, la sintassi di accesso agli array non è possibile direttamente su una chiamata di funzione.

Devi usare una variabile temporanea , come questa:

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

Nel tuo caso, questo probabilmente significa usare qualcosa del genere:

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

Devi :

  • per prima cosa, chiama il tuo getData()metodo e memorizza il suo valore di ritorno in una variabile temporanea
  • quindi, usa quella variabile temporanea per il tuo test

Non hai molta scelta al riguardo, in realtà ...


Bene, come ho detto, il mio problema è che questo codice viene inserito, direttamente in if (/ * code va qui * /) quindi definire una funzione lì non è davvero possibile ...
enyo

Non è possibile assegnare il risultato della chiamata al metodo a una variabile prima dell'istruzione if e utilizzare quella variabile nell'istruzione if, invece di provare direttamente a chiamare il metodo dall'istruzione if?
Pascal MARTIN

1
Sfortunatamente no ... Questo è un motore di modelli e non ho alcun controllo su di esso.
enyo

12

Ok ... a quanto pare non c'è davvero un modo migliore, quindi mi risponderò con una soluzione non così bella:

Ho creato la funzione:

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

E l'ho usato in questo modo:

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

Non è carino ma funziona.


1

$this->dataè sempre accessibile, se protetto. non è accessibile da qualsiasi luogo, quindi se stai restituendo il tuo codice ed è valutato come tale, dovrebbe essere ok.$object->data$this

A proposito, c'è un bug nel tuo codice: le virgolette devono essere evitate.

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

Sì, scusa ... ho corretto il mio post: $ this-> i dati sono privati ​​ovviamente. Corretto anche il mio errore di battitura durante la creazione del bug.
enyo

1

È possibile dalla versione PHP 5.4.

Se non vuoi una variabile temporanea per questo e la tua versione di PHP è inferiore a 5.4 , puoi comunque utilizzare alcune funzioni integrate per ottenere il primo o l'ultimo elemento:

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

Modifica: !!! Si noti che nelle versioni successive (5.4+) PHP lancerà un avviso, perché end si aspetta solo variabili come parametro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.