4

PHPを使用して、画像ファイル名の配列をチェックして、連続する画像の向きが同じである数を確認したいと思います。

次の例では、インデックス 1 ~ 4 が同じ方向を持っているか、最初のインデックスで同じ方向の 4 つの連続した画像があることを知りたいです。

参考までに、「方向」の値は、垂直が「V」、水平が「H」です。

例えば、

Array
(
[0] => Array
    (
        [filename] => image0.jpg
        [orientation] => V
    )

[1] => Array
    (
        [filename] => image1.jpg
        [orientation] => H
    )

[2] => Array
    (
        [filename] => image2.jpg
        [orientation] => H
    )

[3] => Array
    (
        [filename] => image3.jpg
        [orientation] => H
    )

[4] => Array
    (
        [filename] => image4.jpg
        [orientation] => H
    )
[5] => Array
    (
        [filename] => image5.jpg
        [orientation] => V
    )
[...]
[n]
}

よりも良い方法があるはずです

if ([i]['orientation'] == [i+1]['orientation'])
if ([i]['orientation'] == [i+1]['orientation'] == [i+2]['orientation'])
if ([i]['orientation'] == [i+1]['orientation'] == [i+2]['orientation']  == [i+3]['orientation'])
if ([i]['orientation'] == [i+1]['orientation'] == [i+2]['orientation'] == [i+3]['orientation'] == [i+4]['orientation'])
4

1 に答える 1

7

あなたが適用しようとしているロジックを理解できれば、SplQueue は問題を徹底的かつきちんと OOP 方式で解決するためのすべての機能を提供します。

私はこれを書きましたが、あなたが提供したユースケースに基づいて、うまくテストできました。

// your data array
$array = array(
    array("filename"=>"image0.jpg","orientation"=>"V"),
    array("filename"=>"image1.jpg","orientation"=>"H"),
    array("filename"=>"image2.jpg","orientation"=>"H"),
    array("filename"=>"image3.jpg","orientation"=>"H"),
    array("filename"=>"image4.jpg","orientation"=>"H"));


function queue($array) {

    // grab a new SqlQueue object -- http://php.net/manual/en/class.splqueue.php    
    $q = new SplQueue;
    foreach($array as $key=>$val) {
        // if this is the first iteration or the queue object was emptied out
        if ($q->isEmpty()) {
            $q->enqueue($val);
        } else {

            if ($val['orientation'] == $array[$key--]['orientation']) {
                $q->enqueue($val);
                if (($q->count() % 4) == 0) {
                    return $q;
                }
            } else {
                // Dequeue the whole group on interrupt
                while ($q->valid()) {
                   $q->dequeue();
                }
                // ... and start filling the queue, the mismatch as the new pattern
                $q->enqueue($val);
            }
        }
    }
}

$q = queue($array);
echo $q->count();

データ プロパティenqueued()セットはプライベートであるため、クラスで可視にする必要があります。

PHP 5.4 以降を使用している場合は、次のように、減分された配列インデックス呼び出しを関数配列逆参照に置き換えることができます。

    if ($val['orientation'] == prev($array[$key])['orientation'] {
    //...

他のすべてはかなり標準的です。モジュラス テストは、連続して 4 つの一致を取得するとすぐにキュー オブジェクトを返します。これは、SplQueue オブジェクトが順序付けられたインデックス付き FIFO を強制し、順序付けを解除できないためです。最後に、キューに 4 つの一致が連続して存在する前に一致割り込みが発生した場合、Spl のイテレータはキューを空にして最初からやり直します (最初の新しいパターン)。

それはすべてをカバーするはずです...

HTH :)

于 2012-12-14T09:43:46.627 に答える