简体   繁体   English

检查PHP中多个数组索引的值

[英]Check value at multiple array indexes in PHP

I'd like to check an array of image filenames to see how many consecutive images have the same orientation using PHP. 我想检查一组图像文件名,看看有多少连续图像使用PHP具有相同的方向。

In the following example, I'd like to know that indexes 1 through 4 have the same orientation OR that there are four consecutive images with the same orientation at the first index. 在下面的示例中,我想知道索引1到4具有相同的方向,或者在第一个索引处有四个具有相同方向的连续图像。

For reference, "orientation" values are "V" for vertical and "H" for horizontal. 作为参考,“方向”值对于垂直方向是“V”而对于水平方向是“H”。

eg, 例如,

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]
}

There has to be a better way than 必须有一个更好的方式

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'])

If I understand the logic you're trying to apply, SplQueue provides all the functionality to solve your problem thoroughly and tidily OOP fashion. 如果我理解您尝试应用的逻辑,SplQueue提供了所有功能,可以彻底和整齐地解决您的问题。

I wrote this up and it tests out fine for me based on the use case you provided. 我写了这个,根据你提供的用例,我测试得很好。

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

The data property enqueued() sets is private, so you'll have to make it visibile in your class. data属性enqueued()设置是私有的,因此您必须在类中使其可见。

If you're using PHP 5.4+, you can replace that decremented array index call with function array dereferencing, like so: 如果您使用的是PHP 5.4+,则可以使用函数数组解除引用替换该递减的数组索引调用,如下所示:

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

Everything else is pretty standard. 其他一切都非常标准。 The modulus test returns the queue object as soon as it acquires 4 matches in a row, since SplQueue objects enforce sequenced indexed FIFO, and can't be unsequenced. 模数测试一旦获取连续的4个匹配就返回队列对象,因为SplQueue对象强制执行有序的索引FIFO,并且不能被排除。 Finally, if matching interrupts before the queue has 4 matches in a row, Spl's Iterators make emptying the queue to start over - beginning with the mismatch (first new pattern.) 最后,如果在队列连续4个匹配之前匹配中断,则Spl的迭代器会清空队列以重新开始 - 从不匹配开始(第一个新模式)。

That should cover everything... 那应该涵盖一切......

HTH :) HTH :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM