php: Bir dizi nesnenin yineleyici uygulanmasına ilişkin polimorfizmi?

3 Cevap php

Ben ne istiyorum bir foreach döngü dizi davranışını değiştirmek için, bir dizi gerçekten php üzerinde bir nesne olmadığını biliyorum ... ama yok.

Java üzerinde buna benzer bir şey:

for( String it : myArr = new Array_Iterator( array) implements Iterator{
    public Array_Iterator( String[] arr){ this.arr = arr}
    /* interface implementation */
}){
    /* loop */
}

Ben istemiyorum diziden girdileri alamadım ki ne ben gerçekten başarmak istiyorsanız, filtrenin bir tür

3 Cevap

Sadece bir ArrayIterator içine Array sarın ve düzenli yöntemleri üzerine yazmak için özgürsünüz. Spl başka Iterators ve Interfaces, işinize yarayabilecek bir dizi sağlar. Yineleyicileri üzerinden diziler filtrelemek için, kullanım FilterIterator kullanabilirsiniz.

PHP Manual Örnek:

<?php
// This iterator filters all values with less than 10 characters
class LengthFilterIterator extends FilterIterator {
    public function accept() {
        // Only accept strings with a length of 10 and greater
        return strlen(parent::current()) > 10;
    }
}

$arrayIterator = new ArrayIterator(array('test1', 'more than 10 characters'));
$lengthFilter = new LengthFilterIterator($arrayIterator);

foreach ($lengthFilter as $value) {
    echo $value . "\n"; // ignores "test1" in array
}

Muhtemelen PHP fonksiyonu arıyoruz array_filter.

Iterates over each value in the input array passing them to the callback function. If the callback function returns true, the current value from input is returned into the result array. Array keys are preserved.

Eğer yineleyici dayalı yaklaşımı isterseniz de özellikle ArrayIterator FilterIterator ile birlikte, Standard PHP Library (SPL) bakmak olabilir.

Ne istediğiniz bir dizinin elemanları için filtre bir tür ise, try array_filter. Eleman tutulması veya yanlış olması için ise o tutulması değilse true döndüren bir işlev yapmak, sonra da array_filter onu geçmek.