2013-07-19 9 views
5

Tôi có một mảng chứa danh sách các giá trị thứ hạng. Xem xét bên dưới mảng:Chuyển phần tử đến cuối mảng

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 
     ) 

) 

Tôi muốn thay đổi/di chuyển trang xếp hạng với 'R' như:

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

đến cuối mảng và nó nên được trên chỉ số cuối của mảng?

Chỉnh sửa: Khóa mảng không xác định.

+1

Đây có phải là những gì bạn cần không? 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

Bạn có thể sử dụng 'array_slice' – som

+0

và có bao nhiêu R sẽ ở đó? chỉ một ? –

Trả lời

10

Nếu chỉ số không rõ:

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

FYI, thực tiễn xấu của nó là thay đổi mảng được lặp lại. =) – liding

+0

@liding Nhưng 'ngắt;' dừng lặp lại để mảng không được sử dụng sau khi nó đã bị thay đổi. – Pitchinnate

+0

Mặc dù sửa đổi này của mảng trong khi nó đang được lặp lại là an toàn, tôi nghĩ @ trượt làm cho một điểm tốt cho rằng hầu hết mọi người có thể nghĩ rằng nó an toàn để sửa đổi mảng theo cách này. – ILikeTacos

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

Chỉ số cho giá trị 'R' không thể biết được. Khi tôi xuất mảng của tôi nó có thể được trên bất kỳ chỉ mục như nó có thể được trên [5] hoặc [11]. Điều duy nhất tôi biết là giá trị 'R' và tôi muốn chuyển phần tử đó đến cuối mảng –

1

Một cái gì đó như thế này?

$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

Nếu bạn có nhiều hơn một đối tượng với một 'R' giá trị:

$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, trong OP nó là một mảng các đối tượng, không phải là một mảng các mảng. – Pitchinnate

+0

@Pitchinnate Tôi đã không nhận thấy khoảnh khắc này, cảm ơn bạn. – liding

0

Nếu bạn muốn đặt R là giá trị cuối cùng và giữ phím của bạn, bạn có thể làm điều này:

$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); 

Điều này sẽ cung cấp cho bạn:

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" 
    } 
} 

Xem: http://codepad.org/gPhrktuJ

+0

Điều gì về http://codepad.org/oFskbYVj –

+0

Nếu bạn không muốn giữ tất cả các khóa gốc, điều đó cũng sẽ hoạt động. Trong ví dụ của tôi, các phím trong mảng được lưu giữ. Bằng cách sử dụng array_push bạn mất chìa khóa từ đối tượng với giá trị '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

'$ value' sẽ là một đối tượng sẽ không bao giờ bằng 'R' – Pitchinnate

+0

Perfect !!!! nó làm việc cho tôi! Cảm ơn nhiều. –

+0

@Pitchinnate thankyou sửa –

0

Hãy thử điều này:

$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, trong OP nó là một mảng các đối tượng, không phải là mảng mảng. – Pitchinnate

0

Nếu bạn đang tìm kiếm là đặc biệt giá trị của r, bạn có thể sử dụng array_search

array_search trả về khóa nếu một mục tồn tại trong mảng, nếu không trả về 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

Chúng là các đối tượng trong một mảng không phải là giá trị. – Pitchinnate

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