2015-02-25 12 views
5

Witam Próbuję utworzyć tablicę podrzędną z tablicy tablica.i.e; że mam tablicę takich jak podano poniżejjak korzystać z metody round robin w tablicy w php?

$array = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19} 

który ja eksplodować i przypisać ją do zmiennej $ i .. i uruchomić dla pętli, jak pokazano poniżej ..

for ($i=0;$i<count($array);$i++) { 
    $a = array(); 
    $b = $array[$i]; 
    for($j=0;$j<count($array);$j++){ 
     if($b != $array[$j]){ 

      $a[] = $array[$j]; 
     } 
    } 

się wyjście chcę kiedy

$i = 1 

tablica powinna być

{2,3,4,5,6,7,8,9,10,11} 

kiedy

$i = 2 

tablicy należy

{3,4,5,6,7,8,9,10,11,12} 

Podobnie, gdy

$i=19 

tablicy należy

{1,2,3,4,5,6,7,8,9,10} 

, więc jak mogę to zrobić.

+0

Rozumiesz, że wartości $ a i $ b zostaną nadpisane w każdej iteracji pętli ...? –

+0

Czy możesz wyjaśnić te kryteria trochę? –

+0

Jakie są oczekiwane wyniki? – sectus

Odpowiedz

2
for ($i = 0; $i < count($array); $i++) { 
    if ($i + 10 < count($array)) 
     $a = array_slice($array, $i, 10); 
    else 
     $a = array_merge(array_slice($array, $i), array_slice($array, 0, 10-(count($array)-$i))); 

    // do something with $a before it is over-written on the next iteration 
} 

Ten test:

<?php 
$array = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19); 

for ($i = 0; $i < count($array); $i++) { 
    if ($i + 10 < count($array)) 
     $a = array_slice($array, $i, 10); 
    else 
     $a = array_merge(array_slice($array, $i), array_slice($array, 0, 10-(count($array)-$i))); 

    echo "<h2>$i</h2>\n<pre>".print_r($a,true)."</pre><br />\n"; 
} 

uzyskuje się w tym:

0 

Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 4 
    [4] => 5 
    [5] => 6 
    [6] => 7 
    [7] => 8 
    [8] => 9 
    [9] => 10 
) 
... 
9 

Array 
(
    [0] => 10 
    [1] => 11 
    [2] => 12 
    [3] => 13 
    [4] => 14 
    [5] => 15 
    [6] => 16 
    [7] => 17 
    [8] => 18 
    [9] => 19 
) 

10 

Array 
(
    [0] => 11 
    [1] => 12 
    [2] => 13 
    [3] => 14 
    [4] => 15 
    [5] => 16 
    [6] => 17 
    [7] => 18 
    [8] => 19 
    [9] => 1 
) 
... 
18 

Array 
(
    [0] => 19 
    [1] => 1 
    [2] => 2 
    [3] => 3 
    [4] => 4 
    [5] => 5 
    [6] => 6 
    [7] => 7 
    [8] => 8 
    [9] => 9 
) 
+1

Chociaż nie głosowałem w dół, ale czy możesz powiedzieć nam, jak to się stanie 10 elementami tej tablicy za każdym razem? –

+0

Masz rację - albo pytanie zostało zredagowane, albo nie czytałem wystarczająco uważnie. Odpowiedź edytowana ... –

4

Zakładając $i ma być offset, a nie rzeczywista wartość w tablicy, można zrobić

$fullArray = range(1, 19); 

$i = 19; 
$valuesToReturn = 10; 

$subset = iterator_to_array(
    new LimitIterator(
     new InfiniteIterator(
     new ArrayIterator($fullArray) 
    ), 
     $i, 
     $valuesToReturn 
    ) 
); 

print_r($subset); 

To w źle podać żądany wynik, np.

$i = 1 will give 2 to 11 
$i = 2 will give 3 to 12 
… 
$i = 10 will give 11 to 1 
$i = 11 will give 12 to 2 
… 
$i = 19 will give 1 to 10 
$i = 20 will give the same as $i = 1 again 

i tak dalej.

+0

Wow, to jest jakiś kod stylu CERN tam :) –

+0

czy to zakłada, że ​​zakres macierzy jest w porządku? Jest również całkiem niezły .. Show off;] – Pogrindis

+0

@Pogrindis nie, 'LimitIterator' działa na offset' InfiniteIterator', aby określić elementy w podzbiorze. Podzbiór zostanie zwrócony w tej samej kolejności, co w '$ fullArray', w tym. klawiatura. Będzie to również działać w przypadku tablic asocjacyjnych. – Gordon

2

Działa to dobrze z moim koniec

<?php 
    $array = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19); 

    $size = sizeof($array); // Defining the array size 

    $str = 17; // This is the reference value from which you have to extract the values 

    $key = array_search($str, $array); 

    $key = $key+1; // in order to skip the given reference value 
    $start = $key%$size; 

    $end = $start+9; 

    for($i=$start; $i<=$end; $i++) { 
     $j = ($i%$size); 
     $result[] = $array[$j]; 
    } 

    echo '<pre>'; print_r($result); 


?> 
2
$array = range(1, 19); 

$i = 19; 
$result = array(); 
$after = array_slice($array, $i, 10); 
$before = array_slice($array, 0, 10 - count($after)); 
$result = array_merge($after, $before); 

var_dump(json_encode($result)); 

PS: uwaga 0 element ma 1 wartość i tak dalej ...

1

Wygląda na to, że wszystko czego potrzebujesz to kawałek o określonej wielkości z tablicy, kawałek, który owija się wokół końca tablicy i trwa od samego początku. Traktuje tablicę jak okrągłą listę.

Możesz to osiągnąć na wiele sposobów, jednym z najprostszych (w rozumieniu linii kodu) jest rozszerzenie oryginalnej tablicy poprzez dołączenie jej kopii na końcu i użycie funkcji PHP array_slice(), aby wyodrębnić wycinek wymagania:

function getWrappedSlice(array $array, $start, $count = 10) 
{ 
    return array_slice(array_merge($array, $array), $start, $count); 
} 

oczywiście, trzeba mieć pewność, że $start jest między 0 i count($array) - 1 (włącznie), w przeciwnym razie wartość zwracana przez funkcję nie będzie czego oczekujesz.

1

okrężnie na macierzy można uzyskać poprzez wykonanie operacji „obracanie” wewnątrz każdej iteracji:

for ($i = 0; $i < count($array); ++$i) { 
    // rotate the array (left) 
    array_push($array, array_shift($array)); 
    // use $array 
} 

W pętli najpierw element tablicy jest umieszczony z tyłu. Na końcu pętli tablica jest przywracana do pierwotnej wartości.

Powiązane problemy