简体   繁体   中英

how to reorder array php?

i have array and i need to reorder by another array:

here is my array:

Array
(
    [0] => Array
        (
            [name] => Haroldas
            [number] => 444
            [address] => g.
            [city] => eee
            [country] => f
            [lastname] => r
        )

    [1] => Array
        (
            [name] => Lukas
            [number] => 999
            [address] => rrr
            [city] => tttt
            [country] => 3
            [lastname] => r
        )
)

This is another array with columns number which show me how to order number (columns order can to be another):

Array
(
    [lastname] => 4
    [name] => 1
    [number] => 5
    [address] => 3
    [city] => 0
    [country] => 2
) 

i need result like this:

Array
    (
        [0] => Array
            (
                [city] => eee
                [name] => Haroldas
                [country] => f
                [address] => g.
                [lastname] => r
                [number] => 444
            )
    ...
    )

This should do the job:

<?php

$order = [
    'city'     => 0,
    'name'     => 1,
    'country'  => 2,
    'address'  => 3,
    'lastname' => 4,
    'number'   => 5,
];

$data = [
    [
        'name'     => 'Haroldas',
        'number'   => '444',
        'address'  => 'g.',
        'city'     => 'eee',
        'country'  => 'f',
        'lastname' => 'r',
    ],
    [
        'name'     => 'Lukas',
        'number'   => '999',
        'address'  => 'rrr',
        'city'     => 'ttt',
        'country'  => 3,
        'lastname' => 'r',
    ],
];

foreach ($data as &$entry) {
    uksort($entry, function ($a, $b) use ($order) {
        return strcmp($order[$a], $order[$b]);
    });
}

print_r($data);

The output is:

Array
(
    [0] => Array
        (
            [city] => eee
            [name] => Haroldas
            [country] => f
            [address] => g.
            [lastname] => r
            [number] => 444
        )

    [1] => Array
        (
            [city] => ttt
            [name] => Lukas
            [country] => 3
            [address] => rrr
            [lastname] => r
            [number] => 999
        )

)

If you want to reorder that use foreach then create a new array.

     $arrReorder = [];
    foreach($yourArr as $key => $val){
        $arrReorder[] = ['city' => $val['city'], 'name' => $val['name'], 'country' => $val['country'], 'address' => $val['address'], 'lastname' => $val['lastname'], 'number' => $val['number']  ];
    }
   print_r($arrReorder);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM