1

キー位置2から開始し、キー位置2の前の値を含む配列全体をループするように配列に指示したいのですが、1つの配列を使用して、ループを開始するキー位置を指定したいだけです。たとえば、ここではarray_spliceを使用していますが、希望どおりに機能しません。手伝っていただけませんか。

$names = array('Bill', 'Ben', 'Bert', 'Ernie');
foreach(array_slice($names, 2) as $name){
   echo $name;
}

foreach(array_slice($names, 3) as $name){
   echo $name;
}
4

2 に答える 2

3

キーが無関係な場合は、次のように、配列を2回スプライスし、結果の配列をマージできます。

$names = array('Bill', 'Ben', 'Bert', 'Ernie');
$start = 2;

foreach( array_merge( array_slice($names, $start), array_slice( $names, 0, $start)) as $name){
   echo $name;
}

デモから、これが次のように出力されることがわかります。

BertErnieBillBen

または、効率を上げるために、最初にラップアラウンドすることを認識している2つのループを使用できます。これは、元の配列を操作していて、そのコピーを作成しないため、より効率的です。

$start = 2;
for( $i = $start, $count = count( $names); $i < $count; $i++) {
    echo $names[$i];
}
$i = 0;
while( $i < $start) { 
    echo $names[$i++];
}

これを1つのループに変換し、の内部をラップアラウンドするためのロジックをカプセル化することもできますfor

于 2012-12-10T15:30:48.823 に答える
0
$limit = 2; //so you can set your start index to an arbitrary number
$fn= function($a,$b) use ($limit){
  if(($a < $limit && $b < $limit) 
      || ($a >= $limit && $b >=$limit)) //$a and $b on the same side of $limit
        return $a < $b ? -1 : ($a==$b ? 0 : 1);
  if($a < $limit && $b > $limit) return 1; //because $a will always be considered greater
  if($a >= $limit && $b < $limit) return -1; //because $b will always be considered greater

};
uksort($arr, $fn);
foreach($arr as $v) echo $v;
于 2012-12-10T15:43:13.513 に答える