如何重新排序php数组?

问题描述 投票:0回答:3

我有数组,我需要通过另一个数组重新排序:

这是我的数组:

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

这是另一个带有列号的数组,它向我展示如何对编号进行排序(列顺序可以是另一个):

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

我需要这样的结果:

Array
    (
        [0] => Array
            (
                [city] => eee
                [name] => Haroldas
                [country] => f
                [address] => g.
                [lastname] => r
                [number] => 444
            )
    ...
    )
php arrays
3个回答
1
投票

这应该可以完成这项工作:

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

输出为:

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
        )

)

0
投票

如果您想重新排序,请使用 foreach 然后创建一个新数组。

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

0
投票

首先,按值准备排序数组以方便使用。

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

asort($order);

要修改原始数组,请使用

array_walk()
通过引用进行修改,并用原始行值覆盖不相关的顺序值(使用
array_merge()
array_replace()
)。 演示

array_walk(
    $array,
    fn(&$row) => $row = array_merge($order, $row)
);
var_export($array);

或者使用

array_map()
生成一个新数组。 演示

var_export(
    array_map(
        fn($row) => array_merge($order, $row),
        $array
    )
);

这些方法是合适的,因为排序数组中的所有键都存在于数据数组的所有行中。 如果行中有更多列,那么它们将位于排序数组中指定的键之后。

© www.soinside.com 2019 - 2024. All rights reserved.