簡體   English   中英

轉換多維數組

[英]Convert multidimensional array

如何將下面的數組轉換為下面的數組。 我正在嘗試使用array_map,但是我對如何編寫函數感到困惑。

array(3) {
  ["award_year"]=>
  array(2) {
    [0]=>
    string(7) "1999-01"
    [1]=>
    string(7) "2010-02"
  }
  ["award_title_user"]=>
  array(2) {
    [0]=>
    string(1) "2"
    [1]=>
    string(2) "tt"
  }
  ["award_description_user"]=>
  array(2) {
    [0]=>
    string(1) "2"
    [1]=>
    string(3) "ddd"
  }
}

這是我想要達到的目標:

array(2) {
  [0]=>
  array(3) {
    ["award_year"]=>
    string(7) "2010-02"
    ["award_title_user"]=>
    string(2) "tt"
    ["award_description_user"]=>
    string(3) "ddd"
  }
  [1]=>
  array(3) {
    ["award_year"]=>
    string(7) "1999-01"
    ["award_title_user"]=>
    string(1) "2"
    ["award_description_user"]=>
    string(1) "2"
  }
}
$newArr = [];
foreach($oldArr as $key=>$row) {
   foreach($row as $index=>$item) {
       $newArr[$index][$key] = $item;
   }   
}

這將解決問題,但是不會像您提到的那樣檢查數據是否有效

首先,在這種情況下,@ tzook-bar-noy的答案是一個更好的答案,我什至不提倡我在這里詳述的方法。

在處理數組時,如果可能的話,我總是盡量避免泛型循環(即: foreach() ),而是使用您在問題中提到的更具功能性的編程方法:使用諸如array_map()類的函數。 但是,函數編程功能非常專注於它們的工作(這是它們的好處:它們使您的代碼更清潔 ),因此要使用它們:您一定要執行它們提供的特定操作。

array_map()對於您的目的有一個缺點,因為映射的數組具有與原始數組相同的鍵,並且順序相同,因此這不是您想要的。 您都需要將原始數組“由內而外”,但是所需的結果數組的順序與原始數據相反。 不太適合array_map()

它可以與array_map() ,但是就像您確實需要飛利浦時使用一字螺絲刀一樣。

這是一個例子:

<?php
$awards = [
    "award_year" => ["1999-01", "2010-12"],
    "award_title_user" => ["2", "tt"],
    "award_description_user" => ["2", "ddd"]
];

$remappedAwards = array_map(function($year, $title, $description){
    return [
        "award_year" => $year,
        "award_title_user" => $title,
        "award_description_user" => $description
    ];
}, $awards["award_year"], $awards["award_title_user"], $awards["award_description_user"]);

$remappedAwards = array_reverse($remappedAwards);

echo "<pre>";
var_dump($remappedAwards);
echo "</pre>";

顯然,我在這里也對鍵名進行了硬編碼,這不太理想。 可以設想一種通用方法,但是到那時,我們遠遠超出了aaray_map()的實際意圖, aaray_map()於代碼復雜性將變得愚蠢。

在其他語言中,這些數組迭代函數的實現要好一些(例如JS或CFML),也許可以通過.reduce()JSCFML )類型的操作提出半個體面的答案。 但是,PHP的array_reduce() (及其其他數組迭代方法)因其糟糕的實現而受阻,因為它們僅將傳遞給回調。 他們確實確實還需要至少傳遞索引,並且(很少使用,但有時也很方便〜)將數組本身作為附加參數,以使它們不只是概念驗證。 IMO,顯然(我有偏見,我比PHP做更多的JS和CFML,所以我的期望值更高)。

底線: array_map()不太適合您的需求,但是我為您的努力表示贊賞,因為數組操作的函數編程方法絕對比需求匹配功能的通用循環更好。

暫無
暫無

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

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