簡體   English   中英

基於另一個數組重新排列多維數組的每一行中的順序或元素

[英]Rearrange order or elements in each row of a multidimensional array based on another array

我有一組關聯的 arrays 並且每行中的鍵不是我想要的順序。 如何調整所有行以使它們的關聯鍵按預定義的順序排列?

我的輸入數組:

$array = [
    [
        'FirstName' => 'Robin',
        'Address' => 'Cave',
        'LastName' => 'Mactimmy',
        'Tel' => '9076',
        'Email' => 'i@o.com',
    ],
    [
        'Address' => 'uytr',
        'FirstName' => 'Bill',
        'Email' => 'j@k.com',
        'LastName' => 'Gates',
        'Tel' => '7654',
    ],
    [
        'LastName' => 'Mahoney',
        'Email' => 'y@i.ie',
        'FirstName' => 'Tom',
        'Tel' => '5689',
        'Address' => 'kklll',
    ]
];

我的首選順序是FirstNameLastNameAddressTelEmail ,我將這些值存儲在一個數組中。

我已經嘗試過ksort()usort() ,但是使用我的代碼,數組排序似乎沒有更新。

我想要的結果:

[
    [
        'FirstName' => 'Robin',
        'LastName' => 'Mactimmy',
        'Address' => 'Cave',
        'Tel' => '9076',
        'Email' => 'i@o.com',
    ],
    [
        'FirstName' => 'Bill',
        'LastName' => 'Gates',
        'Address' => 'uytr',
        'Tel' => '7654',
        'Email' => 'j@k.com',
    ],
    [
        'FirstName' => 'Tom',
        'LastName' => 'Mahoney',
        'Address' => 'kklll',
        'Tel' => '5689',
        'Email' => 'y@i.ie',
    ]
]

基本數據:

$array = [
    0 => Array
        (
            'FirstName' => 'Robin',
            'Address' => 'Cave',
            'LastName' => 'Mactimmy',
            'Tel' => '9076',
            'Email' => 'i@o.com',
        ),

    1 => Array
        (
            'Address' => 'uytr',
            'FirstName' => 'Bill',
            'Email' => 'j@k.com',
            'LastName' => 'Gates',
            'Tel' => '7654',
        ),

    2 => Array
        (
            'LastName' => 'Mahoney',
            'Email' => 'y@i.ie',
            'FirstName' => 'Tom',
            'Tel' => '5689',
            'Address' => 'kklll',
        )
];

我認為這是一個很好的解決方案:

<?php

$order = [ 'FirstName', 'LastName', 'Address', 'Tel', 'Email'];

$result = [];
foreach ($array as $sortable) {
    $result[] = array_merge(array_flip($order), $sortable);
}

print_r($result);

您可以將array_maparray_merge結合使用。 像這樣的東西:

$result = array_map(
    function ($arr) use($sample) { return array_merge($sample, $arr); },
    $array
);

在這里,我假設$array是對象數組,而$sample是具有正確有序鍵的數組。

使用自定義鍵排序器:

function cmp($a, $b) {
    // Custom key sort
}

uksort($array, "cmp");

或使用遞歸 ksort:

ksortRecursive(&$array, $sort_flags = SORT_REGULAR) {
    if (!is_array($array)) return false;
    ksort($array, $sort_flags);
    foreach ($array as &$arr) {
        ksortRecursive($arr, $sort_flags);
    }
    return true;
}

借用: https : //gist.github.com/cdzombak/601849

function cmp($a, $b)
{
    $order = array('FirstName' => 0, 'LastName' => 1, 'Address' => 2, 'Tel' => 3, 'Email' => 4);
    if ($a == $b || !isset($order[$a]) || !isset($order[$b])) {
        return 0;
    }
    return ($order[$a] < $order[$b]) ? -1 : 1;
}

uksort($a, "cmp");
function customArraySort($array, $exampleArray) {
  $returnArray = array();
    foreach($array as $arrIndex => $arrSubArr) {
      $returnArray[$arrIndex] = array();
        foreach($exampleArray as $exArIndex => $value)
          $returnArray[$arrIndex][$exArIndex] = $arrSubArr[$exArIndex];
    }
  return $returnArray;
}

array_walk()是這個任務的一個很好的工具,因為它允許你傳入一個數組以在每次迭代中使用。

通過引用修改每一行並用array_merge()的乘積覆蓋每一行,該乘積在保留原始值的同時尊重所需的鍵。

代碼:(演示

array_walk(
    $array,
    fn(&$row, $index, $order) => $row = array_merge($order, $row),
    array_flip(['FirstName', 'LastName', 'Address', 'Tel', 'Email'])
);
var_export($array);

從 PHP7.4 開始,箭頭 function 語法消除了調用use()來邀請自定義 function scope 內的全局范圍數據的需要。 array_map()返回新數組而不是修改原始數組。

代碼:(演示

$order = array_flip(['FirstName', 'LastName', 'Address', 'Tel', 'Email']);
var_export(
    array_map(fn($row) => array_merge($order, $row), $array)
);

作為記錄,因為正在使用的 arrays 是關聯的,所以可以使用array_replace()代替array_merge()以達到相同的效果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM