[英]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',
]
];
我的首選順序是FirstName
、 LastName
、 Address
、 Tel
、 Email
,我將這些值存儲在一個數組中。
我已經嘗試過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_map
與array_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;
}
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.