2015-11-02 64 views
4

我有這樣的陣列:PHP:與來自一個單一的陣列的共享密鑰爲新的陣列合成數據

array(5) { 
    [0]=> 
    array(4) { 
    ["productCode"]=> 
    string(4) "X001" 
    ["productUPC"]=> 
    string(3) "261" 
    ["productTextSeq"]=> 
    string(1) "1" 
    ["productTxtVal"]=> 
    string(5) "Text1" 
    } 
    [1]=> 
    array(4) { 
    ["productCode"]=> 
    string(4) "X001" 
    ["productUPC"]=> 
    string(3) "261" 
    ["productTextSeq"]=> 
    string(1) "2" 
    ["productTxtVal"]=> 
    string(5) "Text2" 
    } 
    [2]=> 
    array(4) { 
    ["productCode"]=> 
    string(4) "X001" 
    ["productUPC"]=> 
    string(3) "261" 
    ["productTextSeq"]=> 
    string(1) "3" 
    ["productTxtVal"]=> 
    string(5) "Text3" 
    } 
    [3]=> 
    array(4) { 
    ["productCode"]=> 
    string(4) "X002" 
    ["productUPC"]=> 
    string(3) "262" 
    ["productTextSeq"]=> 
    string(1) "1" 
    ["productTxtVal"]=> 
    string(5) "Text1" 
    } 
    [4]=> 
    array(4) { 
    ["productCode"]=> 
    string(4) "X002" 
    ["productUPC"]=> 
    string(3) "262" 
    ["productTextSeq"]=> 
    string(1) "2" 
    ["productTxtVal"]=> 
    string(5) "Text2" 
    } 
} 

利用上述輸入,我想輸出數組看起來像這樣:

array(2) { 
    [0]=> 
    array(3) { 
    ["productCode"]=> 
    string(4) "X001" 
    ["productUPC"]=> 
    string(3) "261" 
    ["productTxtVal"]=> 
    string(17) "Text1 Text2 Text3" 
    } 
    [1]=> 
    array(3) { 
    ["productCode"]=> 
    string(4) "X002" 
    ["productUPC"]=> 
    string(3) "262" 
    ["productTxtVal"]=> 
    string(11) "Text1 Text2" 
    } 
} 

當productCode相同時,結果數組不需要productTextSeq鍵,只是productTextVal的組合值。我已經搜索過這個例子,但似乎我找到的每個例子都基於多個輸入數組。我知道我可以用嵌套的foreach函數蠻力,但會喜歡更優雅的解決方案。

回答

0

最後我只是做的蠻力方法,這裏是我的解決方案,如果任何人的興趣:

$productData = array(); 
$sortedData = array(); 
$comments = ''; 
$saveKey = ''; 
$appendComment = false; 
$idx = 0; 

foreach ($data as $key=>$value) { 

    foreach ($value as $k=>$v) { 
     if ($k == 'productCode') { 
      if ($v == $saveKey) { 
       $appendComment = true; 
      } else { 
       $appendComment = false; 
       $saveKey = $v; 
       if ($idx !== 0) { // Don't write to array on first iteration! 
        $productData['productTxtVal'] = $comments; 
        $sortedData[] = $productData; 
       } 
      } 
     } 

     if ($k == 'productTxtVal') { 
      if ($appendComment == true) { 
       $comments .= ' ' . trim($v); 
      } else { 
       $comments = trim($v); 
      } 
     } 
    } 

    $productData = $value; 
    $idx++; 
} 

不「雅」,但它的工作原理。如果只有一個productCode在原始數組中,我也會在這個邏輯之後進行檢查,因爲它不會被寫入到$ sortedData數組中,因爲這個鍵永遠不會改變。

0

以下代碼假定您控制原始數據數組的內容(由於使用extract()函數注入的風險),並且沒有兩個具有相同productCode的項目具有相同的productTextSeq

$products = []; 
foreach ($data as $item) { 
    // extract contents of item array into variables 
    extract($item); 
    if (!isset($products[$productCode])) { 
     // create product array with code, upc, text as array 
     $products[$productCode] = compact('productCode', 'productUPC') + ['productTxtVal' => []]; 
    } 
    // add text value to array with sequence as index 
    $products[$productCode]['productTxtVal'][$productTextSeq] = $productTxtVal; 
} 

$products = array_values(// ignore array keys 
    array_map(function($product) { 
     ksort($product['productTxtVal']); // sort text as array by index/ sequence 
     $product['productTxtVal'] = implode(' ', $product['productTxtVal']); // implode into string 
     return $product; 
    }, $products) 
); 

你可以在這裏運行代碼:https://repl.it/BWQL

相關問題