2009-06-30 3 views
0

У меня есть следующий код, который в настоящее время ограничивает результат в несколько типов (банан, апельсин или все):Ограничение массива результатов

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>"; 
} 

$ г [0] является тип продукта и $ setype = $ _GET [тампон]; устанавливает тип продукта.

Мне нужно совместить приведенный выше код с целью ограничения результатов с помощью $ r [0], который является значением id в массиве. Массив создается из XML-запроса с другого сайта, поэтому я не контролирую его, поэтому это не просто случай удаления записей из массива.

Например, массив может иметь до 50 различных идентификаторов, но я хочу ограничить отображаемые в таблице только 10 (1024, 1045, 1023 и т. Д.).

Пожалуйста, помогите, это моя доминация в !!!!

+0

Получаете ли вы данные из базы данных? –

+0

Нет, все это хранится в массиве ... – 2009-06-30 14:48:17

+0

Не забудьте поставить 'stype' в' $ _GET [stype] 'в кавычках, так как это строка. Или это действительно постоянный? – Gumbo

ответ

0

Вы можете добавить счетчик и перерыв после прохождения 10 итераций, так как вы не можете изменить запрос.

$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:

Я предположил, что вы хотите, чтобы ограничить результат первых 10 идентификаторов. Я не уверен, если вы хотите ограничить его до 10 конкретных идентификаторов. Просьба пояснить, действительно ли это так:

Редактировать 2: Вводит конкретные идентификаторы в базовую матрицу.

+0

спасибо, но разве это не означает, что первые 10 вместо меня могут выбрать нужные записи? – 2009-06-30 14:58:52

+0

Да, вопрос в этом смысле был расплывчатым, позвольте мне исправить. –

+0

Да, это будет конкретный ID – 2009-06-30 15:01:56

0

Не могли бы вы создать второй, временный массив и пропустить элементы первого - начиная с первого объекта, который вы хотите отобразить?

// 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 
} 

Будет ли это делать трюк? Очевидно, вы измените 1023 и 1034 в соответствии с вашими значениями.

0

Вы можете создать другую функцию фильтра, которая позволяет фильтровать массив на основе определенного ключа. Я сделал это с помощью foreach, но вы могли бы использовать array_filter() и create_function(), как и у вас в другой функции.

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)); 

Вы могли бы объединить два в одну функцию, которая, вероятно, будет быстрее, но менее полезна для других задач.

+0

Для этого потребуется две итерации - будьте осторожны с большими массивами. –

0

Очень хороший и гибкий OOP-полосная использует FilterIterator класс (PHP> = 5.1.0):

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)); 
    } 
} 

Это позволяет сделать следующее:

$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>"; 
} 

Таким образом, ваши фильтры инкапсулируются в отдельные классы, и их можно складывать произвольно. Накладные расходы небольшие, и вы получаете много в отношении дизайна и повторного использования (и вы можете избавиться от своей динамической функции).

Смежные вопросы