PHP: ย้ายองค์ประกอบอาร์เรย์ที่เชื่อมโยงไปยังจุดเริ่มต้นของอาร์เรย์


97

อะไรคือวิธีที่ดีที่สุดในการย้ายองค์ประกอบของอาร์เรย์ที่เชื่อมโยงไปยังจุดเริ่มต้นของอาร์เรย์

ตัวอย่างเช่นสมมติว่าฉันมีอาร์เรย์ต่อไปนี้:

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

สิ่งที่ฉันต้องการทำคือย้ายองค์ประกอบ 'หนึ่ง' ไปที่จุดเริ่มต้นและจบลงด้วยอาร์เรย์ต่อไปนี้:

$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 

คำตอบ:


185

คุณสามารถใช้ตัวดำเนินการอาร์เรย์อาร์เรย์ ( +) เพื่อรวมอาร์เรย์เดิมเข้ากับอาร์เรย์เชื่อมโยงใหม่โดยใช้คีย์ที่oneทราบ

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

คีย์อาร์เรย์มีลักษณะเฉพาะดังนั้นจึงเป็นไปไม่ได้ที่จะมีอยู่ในสองตำแหน่ง

ดูเพิ่มเติมที่ doc on Array Operators:

ตัวดำเนินการ + ส่งคืนอาร์เรย์ด้านขวาที่ต่อท้ายอาร์เรย์ด้านซ้าย สำหรับคีย์ที่มีอยู่ในอาร์เรย์ทั้งสองจะใช้องค์ประกอบจากอาร์เรย์ซ้ายมือและองค์ประกอบที่ตรงกันจากอาร์เรย์ทางขวามือจะถูกละเว้น


3
@andrewtweber ไม่ฉันไม่ แต่ฉันได้ทำการทดสอบและพบว่าเมื่อเทียบกับวิธีการของ Emil มันเร็วกว่า 3 เท่าและใช้หน่วยความจำมากกว่าครึ่งหนึ่ง ฉันยังพบว่าต้องใช้เวลามากกว่าการย้ายองค์ประกอบเดียวกันไปยังจุดสิ้นสุดของอาร์เรย์ถึง 20%
Mark Eirich

6

หากคุณมีคีย์อาร์เรย์ที่เป็นตัวเลขและต้องการทำดัชนีคีย์อาร์เรย์อีกครั้งจะเป็นการดีกว่าที่จะวางไว้ในarray_mergeลักษณะนี้:

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

2

ช้าไปหน่อย แต่ในกรณีที่ใครต้องการฉันก็สร้างตัวอย่างข้อมูลนี้ขึ้นมา

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

เพียงปรับให้เหมาะกับความต้องการของคุณหรือใช้และยกเลิกการตั้งค่าดัชนีเพื่อย้าย ทำงานร่วมกับอาร์เรย์ที่เชื่อมโยงได้เช่นกัน


การแก้ไข: $ new_arr [$ arr_key] = $ arr_value; ควรเป็น: if ($ arr_key! = $ key) $ new_arr [$ arr_key] = $ arr_value; แต่อย่างอื่น: ยอดเยี่ยม! 1up.
nzn


1

หากคุณมี 2 อาร์เรย์ 1 มีองค์ประกอบที่จะย้ายไปที่ด้านบนสุดของอาร์เรย์องค์ประกอบที่ 2 คุณสามารถใช้ได้

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

นี่คือตัวอย่างโค้ด:

//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

มีฟังก์ชั่นในความคิดเห็นของคู่มือ PHP สำหรับarray_unshiftซึ่งสามารถใช้เพื่อเพิ่มองค์ประกอบพร้อมคีย์ไปยังจุดเริ่มต้นของอาร์เรย์:

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

ยกเลิกการตั้งค่าองค์ประกอบและใส่เข้าไปใหม่อีกครั้งด้วยฟังก์ชันด้านบน:

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

วิธีการทั่วไปอาจใช้uksortเพื่อจัดเรียงอาร์เรย์ของคุณตามคีย์และจัดเตรียมฟังก์ชันการเรียงลำดับของคุณเอง


สวัสดี - ขอบคุณสำหรับคำตอบแม้ว่าฉันจะไม่ต้องการเรียงลำดับอาร์เรย์ แต่อย่างใด ฉันต้องการทราบคีย์องค์ประกอบและย้ายเฉพาะองค์ประกอบ specfic นั้นไปยังจุดเริ่มต้นของอาร์เรย์

ฉันคิดว่า "=" เป็นข้อผิดพลาดทางไวยากรณ์:return = array_reverse($arr, true);
Mark Eirich

นอกจากนี้เมื่อฉันรันโค้ดของคุณฉันได้รับอาร์เรย์ที่มีเพียงองค์ประกอบเดียวในนั้น ... :-(
Mark Eirich
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.