Dizi sonuçları sınırlama

4 Cevap php

Şu anda türleri (Muz, Portakal veya tüm) bir çift içine sonucu sınırlar aşağıdaki kodu var:

function selectFromArray($prefix="", $productArray=array()) {
    if(!strlen($prefix)) return $productArray;
    return array_filter($productArray,
        create_function('$element', 
             'return (stripos($element[1],'.var_export($prefix, true).') === 0); '));
}
$setype = $_GET[stype];
$list = selectFromArray($setype, $list);
foreach($list as $r) 
{ 
$size2 = $r[2]; 
 echo "<tr>
        <td id=\"id\"><span id=\"non_sorting_header\">" .$r[0]. "</span></td>
        <td id=\"name\"><span id=\"non_sorting_header\">" .$r[1]. "</span></td>
        <td id=\"speed\"><span id=\"sorting_header\">" .kMGTB2($size2). "</span></td>
    	<td id=\"download\"><span id=\"sorting_header\">" .$r[3]. " Gb<br />per month</span></td>
        <td id=\"contract\"><span id=\"sorting_header\">1<br />month</span></td>
        <td id=\"info\"><span id=\"non_sorting_header\">".$r[5]."</span></td>
        <td id=\"buy\"><span id=\"non_sorting_header\">&pound;".$r[4]."<br />".$r[6]."</span></td>
      </tr>"; 
}

$r[0] is the product type and $setype = $_GET[stype]; sets the product type.

Ben $ r [0] dizi id değeri kullanılarak daha sonuçları sınırlamanın bir yolu yukarıda kodu birleştirmek gerekiyor. Dizi başka bir siteden bir XML sorgu oluşturulur - bu yüzden bunun üzerinde hiçbir kontrole sahip, diziden girdileri kaldırma onun sadece bir durum yani.

Örneğin dizi, 50 farklı id yıllara kadar olabilir ama ben sadece 10 (1024,1045,1023 vb) için tabloda görüntülenen olanları sınırlamak istiyorum.

Bu kafamı doiung lütfen yardım!!

4 Cevap

Eğer sorguyu değiştiremezsiniz beri, sayaç eklemek ve 10 tekrarlamalar geçtikten sonra kesebilirsiniz.

$ids = array(1043,1055,1078);
foreach($list as $r) 
{ 
    if (in_array($r[0], $ids))
    {
    	$size2 = $r[2]; 
    	 echo "<tr>
    	        <td id=\"id\"><span id=\"non_sorting_header\">" .$r[0]. "</span></td>
    	        <td id=\"name\"><span id=\"non_sorting_header\">" .$r[1]. "</span></td>
    	        <td id=\"speed\"><span id=\"sorting_header\">" .kMGTB2($size2). "</span></td>
    	        <td id=\"download\"><span id=\"sorting_header\">" .$r[3]. " Gb<br />per month</span></td>
    	        <td id=\"contract\"><span id=\"sorting_header\">1<br />month</span></td>
    	        <td id=\"info\"><span id=\"non_sorting_header\">".$r[5]."</span></td>
    	        <td id=\"buy\"><span id=\"non_sorting_header\">&pound;".$r[4]."<br />".$r[6]."</span></td>
    	      </tr>"; 
    }
}

Edit:

Ben ilk 10 ID adlı sonucu sınırlamak istiyorsanız kabul ettik. Im değil 10 özel kimlik yerine 'bunu sınırlamak istiyorsa emin olun. Bu durumda olup olmadığını açıklayabilir

Edit 2: Accommodates specific ID's in a base array.

Görüntülemek istediğiniz ilk nesne ile başlayan - ilk birinin elemanları aracılığıyla ikinci bir geçici dizi ve döngü oluşturabilir?

// Pseudo code, ignore minor errors :P
$array = array();

for ($i = 1023, $i > 1034, $i++){
    // Copy your array elements from $r to $temp;
}

foreach ($temp as $whatever) {
    // Print out $whatever
}

Bu hile yapmak istiyorsunuz? Açıkçası sizin değerleri uygun 1023 ve 1034 değiştirmek istiyorum.

Eğer belirli bir anahtar dayalı bir dizi filtre sağlayan başka bir filtre işlevi oluşturabilirsiniz. Ben bir foreach ile yaptım ama size başka bir fonksiyonu var gibi array_filter() ve create_function() kullanabilirsiniz.

function filterArrayByKeyInArray($array, $searchKey, $searchValues) {
    $result = array();
    foreach ($array as $key => $row) {
        if (in_array($row[$searchKey], $searchValues)) {
            $result[$key] = $row;
        }
    }
    return $result;
}

//snip
$list = selectFromArray($setype, $list);
$list = filterArrayByKeyInArray($list, 0, array(1024,1045,1023));

Muhtemelen diğer görevler için daha hızlı ama daha az yararlı olacağını, tek fonksiyon içine iki birleştirmek olabilir.

Çok güzel ve esnek bir cepten yönlü FilterIterator sınıf (PHP> = 5.1.0) kullanıyor:

class PrefixFilter extends FilterIterator 
{
    /**
     * @var string
     */
    protected $_prefix;

    /**
     * @param  Iterator $iterator
     * @param  string   $prefix
     */
    public function __construct(Iterator $iterator, $prefix)
    {
        parent::__construct($iterator);
        $this->_prefix = $prefix;
    }

    /**
     * @return boolean
     */
    public function accept()
    {
        if (!strlen($this->_prefix)) {
            return true;
        } else {
            $item = $this->getInnerIterator()->current();
            return (stripos($item[1], $this->_prefix) === 0);
        }
    }
}

class IdFilter extends FilterIterator 
{
    /**
     * @var array
     */
    protected $_ids;

    /**
     * @param  Iterator $iterator
     * @param  array    $ids
     */
    public function __construct(Iterator $iterator, array $ids)
    {
        parent::__construct($iterator);
        $this->_ids = $ids;
    }

    /**
     * @return boolean
     */
    public function accept()
    {
        $item = $this->getInnerIterator()->current();
        return (in_array($item[0], $this->_ids));
    }
}

Bu aşağıdakileri yapmanızı sağlar:

$iterator = new IdFilter(
    new PrefixFilter(
        new ArrayIterator($list),
        ''
    ),
    array(1024, 1045, 1023)
);
foreach($iterator as $r) { 
    $size2 = $r[2]; 
    echo "<tr>
        <td id=\"id\"><span id=\"non_sorting_header\">" .$r[0]. "</span></td>
        <td id=\"name\"><span id=\"non_sorting_header\">" .$r[1]. "</span></td>
        <td id=\"speed\"><span id=\"sorting_header\">" .kMGTB2($size2). "</span></td>
        <td id=\"download\"><span id=\"sorting_header\">" .$r[3]. " Gb<br />per month</span></td>
        <td id=\"contract\"><span id=\"sorting_header\">1<br />month</span></td>
        <td id=\"info\"><span id=\"non_sorting_header\">".$r[5]."</span></td>
        <td id=\"buy\"><span id=\"non_sorting_header\">&pound;".$r[4]."<br />".$r[6]."</span></td>
      </tr>"; 
}

Bu şekilde filtreleri ayrı sınıfa kapsüllü ve bunlar keyfi yığılmış olabilir. Havai küçük ve siz (ve sizin dinamik işlevi kurtulabilirsiniz) bir tasarım açısından çok ve tekrar kullanılabilirliği kazanç.