限制阵列结果

时间:2009-06-30 14:30:15

标签: php arrays limit

我有以下代码,目前将结果限制为几种类型(Banana,Orange或所有):

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]是产品类型,$ setype = $ _GET [stype]; 设置产品类型。

我需要结合上面的代码,通过使用$ r [0]进一步限制结果,这是数组中的id值。该数组是从另一个站点的XML查询创建的 - 所以我无法控制它,因此它不仅仅是从数组中删除条目的情况。

例如,数组中最多可以包含50个不同的id,但我想将表中显示的ID限制为10(1024,1045,1023等)。

请帮助这是我的头脑!!!!

4 个答案:

答案 0 :(得分: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>"; 
    }
}

修改:

我假设您想将结果限制为前10个ID。我不确定你是否想将它限制为10个特定ID。请澄清是否是这种情况

编辑2: 容纳基本数组中的特定ID。

答案 1 :(得分: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以适应你的价值观。

答案 2 :(得分: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));

您可以将两者合并为一个功能,这可能会更快,但对其他任务不太有用。

答案 3 :(得分:0)

一个非常好用且灵活的OOP方式是使用FilterIterator类(PHP&gt; = 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>"; 
}

这样,您的过滤器被封装到单独的类中,并且可以任意堆叠。开销很小,你在设计和可重用性方面获得了很多(你可以摆脱你的动态功能)。