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

$r[0] 是产品类型,$setype = $_GET[stype]; 设置产品类型。

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

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

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

4

4 回答 4

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。

于 2009-06-30T14:57:19.610 回答
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 以适应你的价值观。

于 2009-06-30T15:10:52.937 回答
0

您可以创建另一个过滤器函数,让您根据特定键过滤数组。我已经用 foreach 完成了它,但你可以使用array_filter()and ,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));

您可以将两者结合为一个功能,这可能会更快,但对其他任务的用处不大。

于 2009-06-30T15:39:27.233 回答
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>"; 
}

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

于 2009-11-17T08:33:41.327 回答