2013-07-19 17 views
5

Mam tablicę zawierającą listę wartości pagrank. Zastanów się poniżej tablicy:Przesunięcie elementu na koniec tablicy

Array 
(
    [0] => stdClass Object 
     (
      [pagerank] => 3 
     ) 

    [1] => stdClass Object 
     (
      [pagerank] => 1 
     ) 

    [2] => stdClass Object 
     (
      [pagerank] => R 
     ) 

    [3] => stdClass Object 
     (
      [pagerank] => 2 
     ) 

    [4] => stdClass Object 
     (
      [pagerank] => 7 
     ) 

) 

Chcę Shift/move page rank 'R' jak:

[2] => stdClass Object 
     (
      [pagerank] => R 
     ) 

do końca tablicy i powinno być na ostatnim indeksu tablicy?

Edytuj: Klucz tablicy jest nieznany.

+1

Czy to, co trzeba? http://stackoverflow.com/questions/2359652/how-do-i-move-an-array-element-with-a-known-key-to-the-end-of-an-array-in-php –

+1

Możesz użyć 'array_slice' – som

+0

i ilu R będzie tam? tylko jeden ? –

Odpowiedz

10

Jeśli indeks nie jest znana:

foreach($array as $key => $val) { 
    if($val->pagerank == 'R') { 
     $item = $array[$key]; 
     unset($array[$key]); 
     array_push($array, $item); 
     break; 
    } 
} 
+1

FYI, to jest zła praktyka, aby zmienić tablicę, która jest iterowana. =) – liding

+0

@liding Ale 'break;' zatrzymuje iterację, więc tablica nie jest używana po jej zmianie. – Pitchinnate

+0

Chociaż ta modyfikacja tablicy podczas iteracji jest bezpieczna, uważam, że @liding ma dobry punkt, biorąc pod uwagę, że większość ludzi może myśleć, że w ten sposób można bezpiecznie modyfikować tablice. – ILikeTacos

3
$item = $array[2]; 
unset($array[2]); 
array_push($array, $item); 
+0

Indeks dla wartości "R" nie jest znany. Kiedy wyprowadzam moją tablicę, może ona znajdować się na dowolnym indeksie, np. Na [5] lub [11]. Jedyne, co wiem, to wartość "R" i chcę przesunąć ten element na koniec tablicy –

1

Coś takiego?

$var = array(
    'name' => 'thename', 
    'title' => 'thetitle', 
    'media' => 'themedia' 
); 

// Remove first element (the name) 
$name = array_shift($var); 
// Add it on to the end 
$var['name'] = $name; 

var_dump($var); 

/* 
array(3) { 
    ["title"]=> 
    string(8) "thetitle" 
    ["media"]=> 
    string(8) "themedia" 
    ["name"]=> 
    string(7) "thename" 
} 
*/ 

Ref: http://forums.phpfreaks.com/topic/177878-move-array-index-to-end/

0

Jeśli masz więcej niż jeden obiekt z 'R' Wartość:

$current_array = $sorted_array = Array(
    ... 
); 
foreach($current_array as $current_key => $element){ 
    if($element->pagerank == 'R'){ 
     unset($sorted_array[$current_key]); 
     $sorted_array[] = $element; 
    } 
} 
unset($current_array); 
+1

FYI, w OP jest to tablica obiektów, a nie tablica tablic. – Pitchinnate

+0

@Pitchinnate Nie zauważyłem tej chwili, dziękuję. – liding

0

Jeśli chcesz umieścić R jako ostatniej wartości i trzymając klucze, można to zrobić:

$arr = array(
    (object)array('pagerank' => 1), 
    (object)array('pagerank' => 'R'), 
    (object)array('pagerank' => 2), 
); 

// Store in temp var. 
$tmp_arr = $arr; 

// Sort temp array to put 'R' in top. 
asort($tmp_arr); 

// Reset to be able to find the first key in the sorted array. 
reset($tmp_arr); 

// Get key from first value in array. 
$key = key($tmp_arr); 

// Store value from first key. 
$item = $tmp_arr[$key]; 

// Unset key from original array. 
unset($arr[$key]); 

// Insert as last value in original array using original key. 
$arr[$key] = $item; 

// Print result. 
var_dump($arr); 

to daje:

array(3) { 
    [0]=> 
    object(stdClass)#1 (1) { 
    ["pagerank"]=> 
    int(1) 
    } 
    [2]=> 
    object(stdClass)#3 (1) { 
    ["pagerank"]=> 
    int(2) 
    } 
    [1]=> 
    object(stdClass)#2 (1) { 
    ["pagerank"]=> 
    string(1) "R" 
    } 
} 

Patrz: http://codepad.org/gPhrktuJ

+0

Co z tym http://codepad.org/oFskbYVj –

+0

Jeśli nie chcesz zachować wszystkich oryginalnych kluczy, to też by działało. W moim przykładzie klucze w tablicy są przechowywane. Za pomocą array_push tracisz klucz z obiektu o wartości "R". –

1
$item=null; 
    foreach ($array['pagerank'] as $key => $value) 
    { 
    if($value=="R") 
    { 
    $item = $array[$key]; 
    unset($array[$key]); 
    break; 
    } 
    } 
    if($item !=null) 
    array_push($array, $item); 
+2

'Wartość $' byłaby obiektem, który nigdy nie byłby równy 'R' – Pitchinnate

+0

Perfect !!!! to działało dla mnie! Dziękuję Ci bardzo. –

+0

@Pitchinnate thankyou corrected –

0

Spróbuj tego:

$arr = array(array("pagerank" => 3), 
       array("pagerank" => 1), 
       array("pagerank" => 'R'), 
       array("pagerank" => 4), 
       array("pagerank" => 7), 
       array("pagerank" => 5), 
       array("pagerank" => 2) 
     ); 

foreach($arr as $key=>$ar){ 
    if($ar["pagerank"] == "R"){ 
    $unset = $key; 
    break; 
    } 
} 

$val = $arr[$unset]; 
unset($arr[$unset]); 
$arr[] = $val; 

print_r($arr); 
+0

FYI, w OP jest to tablica obiektów, a nie tablica tablic. – Pitchinnate

0

Jeśli szukasz konkretnie wartość z, możesz użyć array_search

array_search zwraca klucz, jeśli element istnieje w tablicy, w przeciwnym razie zwraca wartość false.

$needle = "R"; 
if($key = array_search($needle, $pageRankArray)) { 
    unset($pageRankArray[$key]); // Delete an item from the array 
    array_push($pageRankArray, $needle); // inserts element at the end of the array 
} 
+0

Są to obiekty w tablicy nie wartości. – Pitchinnate

0
foreach ($arr as $key => $value){ 
    if ($value->pagerank == 'R'){ 
     $arr[] = $value; 
     unset($arr[$key]); 
     break; 
    } 
} 
$arr = array_values($arr); 
Powiązane problemy