7

重複の可能性:
文字列を含む PHP 配列要素を検索する

いくつかの製品をプルする mysql クエリを作成しました。すべて次の情報が含まれています。

商品ID 商品名 商品価格と商品カテゴリ

ページのさらに下で、foreach といくつかの「if」を使用してこれらをループ処理したため、名前に「x」が含まれる製品のみが 1 つの div に表示され、名前に「y」が含まれる製品が別の div に表示されます。 .

ループを実行する前に、各 div に含まれる製品の数を数えるのに苦労しています。

基本的に、私が求めているのは次のとおりです。

特定の条件を満たす配列内のすべての要素をどのように数えますか?

ループを示す追加コード:

<div id="a">
    <?php
    $i = 1;
    foreach ($products AS $product) {
        if (strpos($product->name,'X') !== false) {
            =$product->name
        }
        $i++;
    } ?>
</div>

<div id="b">
    $i = 1;
    foreach ($products AS $product) {
        if (strpos($product->name,'Y') !== false) {
            =$product->name
        }
        $i++;
    } ?>
</div>

実際にループを実行する前に、ここに何個入るか知りたいです。

4

2 に答える 2

11

まあ、コードを見なくても、一般的に言えば、とにかく分割する場合は、前もってそれを行う方がよいでしょうか?

<?php
// getting all the results.
$products = $db->query('SELECT name FROM foo')->fetchAll();

$div1 = array_filter($products, function($product) {
    // condition which makes a result belong to div1.
    return substr('X', $product->name) !== false;
});

$div2 = array_filter($products, function($product) {
    // condition which makes a result belong to div2.
    return substr('Y', $product->name) !== false;
});

printf("%d elements in div1", count($div1));
printf("%d elements in div2", count($div2));

// then print the divs. No need for ifs here, because results are already filtered.
echo '<div id="a">' . PHP_EOL;
foreach( $div1 as $product ) {
   echo $product->name;
}
echo '</div>';

echo '<div id="b">' . PHP_EOL;
foreach( $div2 as $product ) {
   echo $product->name;
}
echo '</div>';

そうは言っても、値をフィルタリングする場合は、「これは通常 SQL の方が高速です」というコメントに注意する必要があります。

EDIT : 変数の名前を変更して、サンプル コードの変数名を適合させました。

于 2012-09-21T11:37:49.600 に答える
3

配列フィルターを使用します: http://www.php.net/manual/en/function.array-filter.php

array array_filter ( array $input [, callable $callback = "" ] )

入力配列の各値を繰り返し処理し、それらをコールバック関数に渡します。コールバック関数が true を返す場合、入力からの現在の値が結果配列に返されます。配列キーは保持されます。

<?php
function odd($var)
{
    // returns whether the input integer is odd
    return($var & 1);
}

function even($var)
{
    // returns whether the input integer is even
    return(!($var & 1));
}

$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array(6, 7, 8, 9, 10, 11, 12);

echo "Odd :\n";
print_r(array_filter($array1, "odd"));
echo "Even:\n";
print_r(array_filter($array2, "even"));
?>

ただし、これはループであり、SQL クエリは高速になることに注意してください。

于 2012-09-21T11:38:24.357 に答える