【问题标题】:Check value at multiple array indexes in PHP检查 PHP 中多个数组索引的值
【发布时间】:2012-12-14 04:20:18
【问题描述】:

我想使用 PHP 检查一组图像文件名,看看有多少连续图像具有相同的方向。

在下面的示例中,我想知道索引 1 到 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'])

【问题讨论】:

标签: php arrays


【解决方案1】:

如果我理解您尝试应用的逻辑,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() sets 是私有的,所以你必须让它在你的类中可见。

如果您使用的是 PHP 5.4+,您可以将递减的数组索引调用替换为函数数组取消引用,如下所示:

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

其他一切都很标准。模数测试在连续获得 4 个匹配项后立即返回队列对象,因为 SplQueue 对象强制执行排序索引 FIFO,并且不能取消排序。最后,如果在队列中有连续 4 个匹配项之前匹配中断,Spl 的迭代器会清空队列以重新开始 - 从不匹配开始(第一个新模式)。

这应该涵盖所有内容......

HTH :)

【讨论】:

  • 出于某种原因,我认为您想对匹配数实施硬性限制 - 即 4。希望这足以让您继续前进,您可以看到小修改将允许您收集匹配直到不匹配并获取总数,或所有匹配对象的队列等。^_^
  • 不是我想要的完全,但仍然可能有用。
  • 您到底想到了什么?我不太确定您的上下文是什么,但是包装所需行为的函数非常普遍-特别是因为所需的行为(无论如何我都理解)-没有单个函数可以满足您的要求,但它肯定是可以使用数组和字符串处理函数来咀嚼它以获得相同的结果。凌乱而尴尬,绝对不是一条线 - 但可能。您是否在迭代多维数组时专注于比较/控制?
  • 最终目标是输出具有相同方向的图像行。例如,第一行包含所有垂直图像,然后在找到第一个水平图像时出现中断。然后第二行包含所有水平图像,直到找到垂直图像。然后第三行包含所有垂直图像,直到找到水平图像等等......想知道我是否可以简单地使用某种 while 循环。
  • 每行有最大数量的图像吗?我发现它是用于 UI 的——比如持续滚动或......?我将在一秒钟内编辑并发布。
猜你喜欢
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多