string(4...">

PHP: combining data with a shared key from one array to a new array

I have this array:

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"
   }
}

With the above input, I want the output array to look like this:

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"
   }
}

The resulting array does not need the key productTextSeq, but only the combined values ​​of productTextVal when the productCode is the same. I searched for SO for examples of this, but it seems that every example I found is based on several input arrays. I know that I can use this function with the help of nested foreach functions, but I would like a more elegant solution.

+4
source share
2 answers

In the end, I just used the brute force method, here is my solution, if anyone is interested:

$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()), 2 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

0

Source: https://habr.com/ru/post/1614179/


All Articles