【问题标题】:Traversing arrays php遍历数组php
【发布时间】:2013-05-23 01:06:22
【问题描述】:

我想知道是否有更好的解决方案来循环从中间到结束然后从开始到中间的数组。特别是对于关联数组。

例如,如果有一个带有键的关联数组

$dow = array(Mon => etc, Tue => etc, Wed  => etc, Thr  => etc .. to .. Sun  => etc). 

我会从星期四开始搜索数组以查找第二天的特定内容,可能是任何一天但恰好在星期二,我通常从星期四(按索引)迭代到星期日,然后重置并从星期一重新开始到达星期二时结婚并找到目标。

我通过 id 计算索引,当它达到 6 时将 id 重置为 0

 $id = 3 // Found day is Thursday id

//Loop function starts here   
$id++; // start search from one day above found day
 if ($id >= 6){ //when reaching Sunday
    $id = 0 // start search from monday
  }  
// check array here for that specific thing

所以问题是问是否有比这更简单的解决方案,即从周四到周日的索引拆分数组并将其添加到数组的开头,然后执行循环而无需计算索引或者是否存在是不使用计数索引的任何其他解决方案。

【问题讨论】:

  • 为什么你需要从星期四开始迭代,特别是(或其他任何一天),而不是从数组的开头开始?
  • 它背后没有任何复杂的逻辑,你做的很简单,没有问题。顺便说一句,你必须在Quotes中写入数组keyvalue(字符串值)
  • 你的实现没有问题
  • 和 SIT LCU 一样,为什么不迭代整个数组。
  • 你的 PHP 版本是多少?

标签: php arrays search loops


【解决方案1】:

也许不是最好的解决方案,而是一个解决方案:

function half($array) {
    $h = sizeof($array) / 2;
    $a1 = array_splice($array, $h);
    $a2 = array_splice($array, 0);
    $res = array_merge($a1, $a2);
    return $res;
}

$dow = array('Mon' => 'etc1', 'Tue' => 'etc2', 'Wed'  => 'etc3', 'Thr'  => 'etc4', 'Fri' => 'etc5', 'Sat' => 'etc6', 'Sun' => 'etc7');

$b = half($dow);

现在您可以使用 foreach 或您想要的方式进行操作。 $b 的结果:

Array
(
    [Thr] => etc4
    [Fri] => etc5
    [Sat] => etc6
    [Sun] => etc7
    [Mon] => etc1
    [Tue] => etc2
    [Wed] => etc3
)

【讨论】:

  • 谢谢,这就是我一直在寻找的,但上面已经得到了答案。非常感谢:)
【解决方案2】:

你可以试试array_splice:

$array = array(1,2,3,4,5,6,7);

$lastDays = array_splice($array, 3);
$firstDays = $array;

print_r(array('first days' => $firstDays, 'last days' => $lastDays));

如果日期不在$lastDays 中(使用像$matchFound 这样的布尔值),那么您将在$firstDays 中搜索。

或者只使用array_merge

$array = array(1,2,3,4,5,6,7);

$array = array_merge(array_splice($array, 3), $array);
print_r($array);

输出是:

Array
(
    [0] => 4
    [1] => 5
    [2] => 6
    [3] => 7
    [4] => 1
    [5] => 2
    [6] => 3
)

然后您可以使用foreach 进行搜索。

【讨论】:

  • 谢谢,我喜欢这种方法,因为它将任何 id 检查/修改从循环中取出。这意味着我可以保持函数简单并将任何数组放入搜索中。它使阅读更简单。至少对我来说:)
【解决方案3】:
<?php

    $dow = array("mon","tue","wed","thu","fri","sat","sun");

    $pick_a_day = 2; // user input; NON zero based. monday = 1
    $pick_a_day--; // make it zero based to use in code

    foreach($dow as $inc => $an_element )
    {
        echo $dow[($pick_a_day+(count($dow))) % (count($dow))]." - loop number:".($inc+1)."\n";
        $pick_a_day++;
    }

?>

输出

tue - loop number:1
wed - loop number:2
thu - loop number:3
fri - loop number:4
sat - loop number:5
sun - loop number:6
mon - loop number:7

【讨论】:

  • 吹毛求疵,但--$pick_a_day$pick_a_day-- 更有效。 foreach 内部的增量也是如此。
  • @STTLCU 哦...??好吧,这立即得到了"OCD" 的批准。感谢您为我的编程风格再添麻烦!呵呵! (继续编写非常脏的代码,但担心变量转换效率)
  • 嘿,我指定它只是吹毛求疵:D
  • 谢谢,这很好用,但希望保持 foreach 循环基本,并将逻辑放在 foreach 循环之外。这样对于我作为新手来说阅读起来很简单。用 array_splice 和合并得到答案。
【解决方案4】:

也许 foreach 会更有效。希望这会有所帮助。

$id = 3 // Found day is Thursday id
$i =0;
//Loop function starts here   
foreach($dow as $idx)
   if($id == $i):

   else if($i > $id):


   endif;

   if($i == count($dow)){$i=0;}else{$i++;}
endforeach;

【讨论】:

  • 感谢您的帮助,我得到了一个使用数组拼接和合并的好方法,这样我就可以将任何 if else 排除在循环之外。
猜你喜欢
  • 2011-03-06
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 2011-05-23
  • 2012-11-14
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多