2012-07-23 13 views
5

PHP, bir dizideki her öğeyi işlemenize izin veren bazı harika işlevlere (array_walk gibi) sahiptir. Genellikle ayarlanmışlardır, böylece ilk parametre olarak işlenmesini istediğiniz diziyi ve her bir öğeye ikinci olarak uygulanacak bir geriçağırım işlevi belirtin. Bu işlevler, booleanların başarısını gösterir, değiştirilmiş dizinin bir kopyasını beklediğiniz gibi değil. Dizinin değiştirilmesini istiyorsanız, diziyi array_walk(&$my_array, 'my_callback');PHP'deki dizileri değiştirmek için array_walk (ve benzer işlevler) gibi işlevleri kullanma> = 5.3

gibi iletmeniz gerekir, ancak PHP 5.3 ve üstü sürümlerde, işlev çağrısına atıfta bulunursanız E_DEPRECATED hatası alırsınız.

Hata tetiklemeden ve açıkça bastırmadan dizileri değiştirmek için bu işlevleri kullanmanın (eğer varsa) doğru bir yolu olduğunu bilen var mı? Bu eski dizi işlem işlevlerine yeni alternatifler var mı.

cevap

7

Değerler örtülü işlev tanımı ile belirlenen PHP> = 5.3 başvuruya göre iletilir. array_walk() için

Fonksiyon tanımı:

bool array_walk (array &$array , callable $funcname [, mixed $userdata = NULL ]) 

Not &$array. Bu nedenle, PHP> = 5.3'teki işlev çağrısında diziyi referans alarak açıkça iletmeniz gerekmez.

array_walk($my_array, 'my_callback'); 

Ancak, (NICKb ile gösterildiği gibi) geri buna göre, referans ile bu değer kabul sağlamak gerekir.

Ayrıca geribildirim için PHP 5.4 Call-time pass-by-reference - Easy fix available?

+0

Ah ... teşekkürler, mantıklı. İlginç bir nüans - referans olarak arayamazsınız, ancak başvurulan argümanlar ile bir fonksiyon/yöntem tanımlayabilirsiniz. http://php.net/manual/en/language.references.pass.php Yine de bu işlevlerin modifiye edilmiş dizilerden kopyalar ya da boole yerine null olmasını isterim! – Ray

+0

Evet, tam olarak. Yardım etmek için sevindim. –

6

Diziyi değiştirmek için başvuruya göre parametresini kabul etmek için geri aramayı tanımlamanız gerekir.

array_walk($my_array, function(&$el, $key) { $el = $el/2; }); 

Yani böyle hızlı bir örnek:

$my_array = range(2, 10, 2); 
array_walk($my_array, function(&$el, $key) { $el = $el/2; }); 
var_dump($my_array); 

Will output:

array(5) { 
    [0]=> 
    int(1) 
    [1]=> 
    int(2) 
    [2]=> 
    int(3) 
    [3]=> 
    int(4) 
    [4]=> 
    int(5) 
} 
+0

teşekkür bakabilirsiniz ama Jasons aşağıda daha net sizin yapılan başvuru sayısında eklendi cevap. Yine de benden bir not aldın! – Ray

+0

+1 benden de örnek için. –

İlgili konular