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

2番目の一時配列を作成し、最初の配列の要素をループして、表示する最初のオブジェクトから始めてください。

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

2 つを 1 つの関数に組み合わせることができます。これはおそらく高速ですが、他のタスクにはあまり役に立ちません。

于 2009-06-30T15:39:27.233 に答える
0

FilterIteratorクラス (PHP >= 5.1.0)を使用するのは、非常に優れた柔軟な OOP 方法です。

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 に答える
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 に答える