TransWikia.com

PHP array with array value into multiple arrays with same key

Code Review Asked by Robert Wilde on December 1, 2020

Very difficult to explain in a sentence sorry so here is example.

I have this array:

$setParams = [
    'repeat_delay' => [23, 1],
    'repeat_type' => ['Hour', 'Day'],
];

that I want to turn into this

$wanted = [
    [
        'repeat_delay' => 23,
        'repeat_type' => 'Hour'
    ],
    [
        'repeat_delay' => 1,
        'repeat_type' => 'Day'
    ]
];

I have it working but wanting to know if there is a cleaner way, or even another way.

$newArray = [];
$setKeys = array_keys($setParams);
$setValues = array_values($setParams);

$isSetValueArray = array_filter($setValues,
    static function ($setValue) {
        return is_array($setValue);
    });

if (!empty($isSetValueArray)) {
    foreach ($setKeys as $keyCount => $key) {
        foreach ($setValues as $valueCount => $value) {
            if (is_array($value)) {
                foreach ($value as $k => $v) {
                    if ($keyCount === $valueCount) {
                        $newArray[$k][$key] = $v;
                    }
                }
            }
        }
    }
}

Some more information to help others. I am sorry I didn’t provide sooner as I know context is everything.

Here is a link to my snippet with more info and complete example.

https://gitlab.mrwilde.solutions/-/snippets/18

One Answer

Assuming you have the same number of items for each key, here are two alternative approaches:

Foreach:

<?php
$setParams = [
    'repeat_delay' => [23, 1],
    'repeat_type'  => ['Hour', 'Day'],
];

$i = 0;
foreach($setParams['repeat_delay'] as $k => $v) {
    $result[$i]['repeat_delay'] = $v;
    $result[$i]['repeat_type']  = $setParams['repeat_type'][$k];
    $i++;
}

Array map:

$result = array_map(null, ...array_values($setParams));
$keys   = array_keys($setParams);
$result = array_map(function($v) use ($keys) { return array_combine($keys, $v);}, $result);

Both result in $result holding the following:

array (
  0 => 
  array (
    'repeat_delay' => 23,
    'repeat_type' => 'Hour',
  ),
  1 => 
  array (
    'repeat_delay' => 1,
    'repeat_type' => 'Day',
  ),
)

You could rewrite the last array_map with the array_combine to:

$result = array_map(fn($v) => array_combine($keys, $v), $result);

Using a short arrow function for brevity.

Correct answer by Progrock on December 1, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP