Array akses dikembalikan oleh fungsi di php


88

Saya menggunakan mesin template yang memasukkan kode ke situs saya di tempat yang saya inginkan.

Saya menulis sebuah fungsi untuk menguji sesuatu yang cukup mudah:

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

Masalahnya adalah, $ this-> data bersifat pribadi, dan saya tidak dapat mengaksesnya di mana pun, jadi saya harus menggunakan getData (); yang menyebabkan masalah saya.

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

tidak berfungsi, dan menetapkan nilai terlebih dahulu juga tidak baik karena akan digunakan secara langsung di blok if ().

Ada ide?


Menetapkan nilai pengembalian pasti berhasil dan merupakan satu-satunya cara. Dapatkah Anda menunjukkan kepada kami kode tidak berfungsi Anda?
Anti Veeranna

Yah itu tidak berfungsi karena kode akan disisipkan dalam if (/ * kode di sini * /). Jadi saya tidak bisa begitu saja menetapkan data sebelumnya.
enyo

1
Apa sih yang sedang kamu bangun? :) sesuatu dengan eval?
Anti Veeranna

Apa yang Anda coba periksa? Apakah Anda mencoba melihat apakah elemen array ada dan memiliki nilai yang tidak kosong? Anda dapat menggunakan fungsi 'kosong' untuk ini. Pertanyaan ini membutuhkan lebih banyak kejelasan!
txwikinger

Bagaimana (dulu) nilai string yang Anda kembalikan myfunction()diproses lebih lanjut? Bagian itu hilang dalam pertanyaan Anda.
hakre

Jawaban:


134

Sejak PHP 5.4, dimungkinkan untuk melakukan hal itu:

getSomeArray()[2]

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

Di PHP 5.3 atau sebelumnya, Anda harus menggunakan variabel sementara.


4
Saya punya PHP 5.4.11-1~precise+1dan fitur ini tidak berfungsi! Mendapat pesan sebagai tanggapanParse error: syntax error, unexpected '['
Eugene

1
+ Eugene apakah Anda membuatnya bekerja? Mungkin orang lain mengalami masalah yang sama.
enyo

2
Butuh waktu hingga php 5.4 untuk mendukung notasi array yang dikembalikan dari fungsi ?! Benar-benar serangga yang jahat.
Basil Musa

Dan kemudian Anda mencoba untuk mendapatkan elemen pertama dari sebuah array yang dihasilkan oleh array_filter dan mulai menangis
Loupax

17

Anda tidak dapat menggunakan sesuatu seperti ini:

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

yaitu, sintaks akses array tidak dimungkinkan secara langsung pada pemanggilan fungsi.

Anda harus menggunakan beberapa variabel sementara , seperti ini:

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

Dalam kasus Anda, ini mungkin berarti menggunakan sesuatu seperti ini:

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

Kamu harus :

  • pertama, panggil getData()metode Anda , dan simpan nilai kembaliannya dalam varibale sementara
  • kemudian, gunakan variabel sementara itu untuk pengujian Anda

Anda tidak punya banyak pilihan tentang itu, sebenarnya ...


Nah, seperti yang saya katakan, masalah saya adalah kode ini dimasukkan, langsung di if (/ * kode dimasukkan ke sini * /) jadi mendefinisikan fungsi di sana tidak mungkin ...
enyo

Bisakah Anda tidak menetapkan hasil pemanggilan metode ke variabel sebelum pernyataan if, dan menggunakan variabel tersebut dalam pernyataan if, daripada langsung mencoba memanggil metode dari pernyataan if?
Pascal MARTIN

1
Sayangnya tidak ... Ini adalah mesin templating, dan saya tidak punya kendali atasnya.
enyo

12

Oke ... ternyata benar-benar tidak ada cara yang lebih baik, jadi saya akan menjawab sendiri dengan solusi yang tidak begitu indah:

Saya membuat fungsinya:

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

Dan menggunakannya seperti ini:

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

Ini tidak bagus tapi berhasil.


1

$this->dataadalah selalu diakses, jika dilindungi. tidak dapat diakses dari mana-mana, jadi jika Anda kembali dalam kode Anda, dan dievaluasi seperti itu, seharusnya baik-baik saja.$object->data$this

Btw, ada bug di kode Anda: Tanda kutip harus di-escape.

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

Ya maaf ... Saya mengoreksi posting saya: $ this-> data bersifat pribadi tentu saja. Juga mengoreksi kesalahan ketik saya saat membuat bug.
enyo

1

Ini dimungkinkan dari PHP versi 5.4.

Jika Anda tidak menginginkan variabel sementara untuk itu dan versi PHP Anda kurang dari 5,4 , Anda masih dapat menggunakan beberapa fungsi bawaan untuk mendapatkan elemen pertama atau terakhir:

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

Sunting: !!! Harap dicatat, bahwa dalam versi yang lebih baru (5.4+) PHP akan memberikan pemberitahuan, karena end hanya mengharapkan variabel sebagai parameter.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.