Php'de bir işlev tarafından döndürülen erişim dizisi


88

Sitemde istediğim yere kod ekleyen bir şablon motoru kullanıyorum.

Oldukça kolay olan bir şeyi test etmek için bir fonksiyon yazdım:

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

Sorun şu ki, $ this-> verisi özeldir ve her yerden erişemiyorum, bu yüzden getData () kullanmam gerekiyor; bu benim sorunuma neden oluyor.

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

çalışmaz ve değerin önce atanması, doğrudan bir if () bloğunda kullanılacağı için de olmaz.

Herhangi bir fikir?


Dönüş değerini atamak kesinlikle işe yarar ve tek yoldur. Çalışmayan kodunuzu bize gösterebilir misiniz?
Anti Veeranna

İşe yaramıyor çünkü kod if (/ * kod buraya * /) içine eklenecek. Bu yüzden verileri daha önce atayamam.
enyo

1
Yine de ne yapıyorsun? :) eval ile bir şey?
Anti Veeranna

Neyi kontrol etmeye çalışıyorsun Dizi öğesinin var olup olmadığını ve boş olmayan bir değere sahip olup olmadığını görmeye çalışıyor musunuz? Bunun için 'boş' işlevini kullanabilirsiniz. Bu sorunun daha fazla açıklığa ihtiyacı var!
txwikinger

Daha sonra myfunction()işlenerek döndürdüğünüz dize değeri nasıl (oldu) ? Sorunuzda bu kısım eksik.
hakre

Yanıtlar:


135

PHP 5.4'ten beri tam olarak şunu yapmak mümkündür:

getSomeArray()[2]

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

PHP 5.3 veya öncesinde, geçici bir değişken kullanmanız gerekir.


4
Buldum PHP 5.4.11-1~precise+1ve bu özellik çalışmıyor! Yanıt olarak mesaj Parse error: syntax error, unexpected '['
Eugene

1
+ Eugene çalıştırabildin mi? Belki başkaları da aynı sorunu yaşıyor.
enyo

2
İşlevlerden dönen dizi gösterimini desteklemek php 5.4'e kadar sürdü ?! Ne iğrenç bir böcek.
Basil Musa

Ve sonra array_filter tarafından oluşturulan bir dizinin ilk elemanını elde etmeye ve ağlamaya başlarsınız
Loupax

18

Bunun gibi bir şey kullanamazsınız:

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

yani, dizi erişimi sözdizimi bir işlev çağrısında doğrudan mümkün değildir.

Bunun gibi bazı geçici değişkenler kullanmanız gerekir :

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

Sizin durumunuzda, bu muhtemelen şuna benzer bir şey kullanmak anlamına gelir:

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

Yapman gerek :

  • önce getData()yönteminizi çağırın ve dönüş değerini geçici bir varibale içinde saklayın
  • daha sonra bu geçici değişkeni testiniz için kullanın

Aslında bu konuda fazla seçeneğin yok ...


Pekala, dediğim gibi, benim sorunum bu kodun doğrudan içine yerleştirilmesi (/ * kod buraya * /) yani bir fonksiyon tanımlamak gerçekten mümkün değil ...
enyo

Yöntemi doğrudan if ifadesinden çağırmak yerine, yöntem çağrısının sonucunu if ifadesinden önce bir değişkene atayamaz ve bu değişkeni if ​​ifadesinde kullanamaz mısınız?
Pascal MARTIN

1
Maalesef hayır ... Bu bir şablon motoru ve onun üzerinde hiçbir kontrolüm yok.
enyo

12

Tamam ... görünüşe göre gerçekten daha iyi bir yol yok, bu yüzden kendime o kadar da güzel olmayan bir çözümle cevap vereceğim:

İşlevi yarattım:

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

Ve bunu şu şekilde kullandım:

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

Bu hoş değil ama işe yarıyor.


1

$this->dataolduğu zaman o korunuyorsa, erişilebilir. her yerden erişilemiyor, bu yüzden geri dönüyorsanız$object->data$this kodunuz içinde ve bu şekilde değerlendirilirse, sorun olmaz.

Btw, kodunuzda bir hata var: Alıntılardan kaçınılması gerekiyor.

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

Evet özür dilerim ... Gönderimi düzelttim: $ this-> veriler elbette gizli. Ayrıca hatayı oluştururken yazım hatamı düzelttim.
enyo

1

PHP 5.4 sürümünden itibaren mümkündür.

Eğer geçici bir değişken istemiyorsanız bunun için ve PHP sürüm 5.4 'ün, az hala ilk veya son eleman almak için yerleşik işlev birkaç kullanabilirsiniz daha:

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

Düzenleme: !!! Lütfen son sürümlerde (5.4+) PHP'nin bir uyarı atacağını unutmayın, çünkü end değişkenleri parametre olarak beklemektedir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.