PHP: Di chuyển phần tử mảng kết hợp đến đầu mảng


94

Phương pháp tốt nhất để di chuyển bất kỳ phần tử nào của một mảng kết hợp về đầu mảng sẽ là gì?

Ví dụ: giả sử tôi có mảng sau:

$myArray = array(
    'two'   => 'Blah Blah Blah 2',
    'three' => 'Blah Blah Blah 3',
    'one'   => 'Blah Blah Blah 1',
    'four'  => 'Blah Blah Blah 4',
    'five'  => 'Blah Blah Blah 5',
);

Những gì tôi muốn làm là di chuyển phần tử 'một' đến đầu và kết thúc bằng mảng sau:

$myArray = array(
    'one'   => 'Blah Blah Blah 1',
    'two'   => 'Blah Blah Blah 2',
    'three' => 'Blah Blah Blah 3',
    'four'  => 'Blah Blah Blah 4',
    'five'  => 'Blah Blah Blah 5',
);
php 

Câu trả lời:


182

Bạn có thể sử dụng toán tử liên hợp mảng ( +) để nối mảng ban đầu thành một mảng kết hợp mới bằng cách sử dụng khóa đã biết ( one).

$myArray = array('one' => $myArray['one']) + $myArray;
// or      ['one' => $myArray['one']] + $myArray;

Các khóa mảng là duy nhất, vì vậy sẽ không thể để nó tồn tại ở hai vị trí.

Xem thêm tại tài liệu về Toán tử Mảng:

Toán tử + trả về mảng bên phải được nối với mảng bên trái; đối với các khóa tồn tại trong cả hai mảng, các phần tử từ mảng bên trái sẽ được sử dụng và các phần tử phù hợp từ mảng bên phải sẽ bị bỏ qua.


3
@andrewtweber Không, tôi không, nhưng tôi đã thực hiện một số thử nghiệm và thấy rằng so với cách tiếp cận của Emil, nó nhanh hơn gấp 3 lần và chiếm một nửa bộ nhớ. Tôi cũng nhận thấy rằng phải mất nhiều thời gian hơn 20% so với việc di chuyển cùng một phần tử đến cuối mảng.
Mark Eirich

5

Nếu bạn có các khóa mảng số và muốn lập chỉ mục lại các khóa mảng, tốt hơn nên đặt nó vào array_mergenhư sau:

$myArray = array_merge(array($key => $value) + $myArray );

2

Hơi muộn, nhưng đề phòng ai cần, tôi đã tạo đoạn mã nhỏ này.

function arr_push_pos($key, $value, $pos, $arr) 
{
    $new_arr = array();
    $i = 1;

    foreach ($arr as $arr_key => $arr_value) 
    {
        if($i == $pos) 
            $new_arr[$key] = $value;

        $new_arr[$arr_key] = $arr_value;

        ++$i;
    }

    return $new_arr;
}

Chỉ cần điều chỉnh nó cho phù hợp với nhu cầu của bạn hoặc sử dụng nó và bỏ đặt chỉ mục để di chuyển. Hoạt động với các mảng liên kết.


Chỉnh sửa: $ new_arr [$ arr_key] = $ arr_value; Nên là: if ($ arr_key! = $ Key) $ new_arr [$ arr_key] = $ arr_value; Nhưng nếu không: xuất sắc! 1 lần.
nzn

1

Đây là một lớp lót đơn giản khác có thể thực hiện điều này bằng cách sử dụng array_splice():

$myArray = array_splice($myArray,array_search('one',array_keys($myArray)),1) + $myArray;

1

nếu bạn có 2 mảng, mảng thứ nhất có các phần tử để di chuyển lên đầu mảng thứ hai các phần tử, bạn có thể sử dụng

$result = \array_replace($ArrayToMoveToTop, $myArray);

Đây là một mẫu mã:

//source array    
$myArray = [
    'two' => 'Blah Blah Blah 2',
    'three' => 'Blah Blah Blah 3',
    'one' => 'Blah Blah Blah 1',
    'four' => 'Blah Blah Blah 4',
    'five' => 'Blah Blah Blah 5',
];
// set necessary order
$orderArray = [
    'one' => '',
    'two' => '',
];
//apply it
$result = \array_replace($orderArray, $myArray);
\print_r($result);

-1

Có một hàm trong phần nhận xét của hướng dẫn sử dụng PHP cho array_unshift có thể được sử dụng để thêm một phần tử, với khóa, vào đầu một mảng:

function array_unshift_assoc(&$arr, $key, $val)
{
    $arr = array_reverse($arr, true);
    $arr[$key] = $val;
    return array_reverse($arr, true);
}

Bỏ đặt phần tử và lắp lại phần tử đó bằng chức năng trên:

$tmp = $myArray['one'];
unset($myArray['one']);
$myArray = array_unshift_assoc($myArray, 'one', $tmp);

Một cách tiếp cận tổng quát hơn có thể là sử dụng uksort để sắp xếp mảng của bạn theo các khóa và cung cấp một chức năng sắp xếp của riêng bạn.


Xin chào - cảm ơn vì câu trả lời, mặc dù tôi không muốn sắp xếp mảng theo bất kỳ cách nào. Tôi muốn để có thể biết một yếu tố quan trọng và di chuyển duy nhất mà yếu tố specfic đến đầu của mảng

Tôi nghĩ rằng "=" là một lỗi cú pháp:return = array_reverse($arr, true);
Đánh dấu Eirich

Ngoài ra, khi tôi chạy mã của bạn tôi nhận được một mảng với chỉ có một phần tử trong nó ... :-(
Đánh dấu Eirich
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.