AnswerBun.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!

Related Questions

C++ linked list inheriting from node class

1  Asked on November 17, 2021 by devinthenrough

       

MMMRjs a product of BYTES Genesis

3  Asked on November 17, 2021 by syed-mohammad-sannan

         

Simple marker rendering

1  Asked on November 17, 2021

     

C++20 ScopeGuard

1  Asked on November 15, 2021

   

LeetCode 37: Sudoku Solver

1  Asked on November 13, 2021

         

Converting a float to a fraction as a string

1  Asked on November 11, 2021 by stonkilla4

   

C# consecutive and redundant null checks

6  Asked on November 11, 2021 by frederik-hoeft

   

Format string processing similar to date or printf()

2  Asked on November 11, 2021 by domsson

     

Improvement to Luhn-Checksum Algorithm in Java

2  Asked on November 11, 2021 by elauser

   

Full Adder in Verilog

1  Asked on November 8, 2021

 

Python palindrome checker function

4  Asked on November 8, 2021 by dicomp

     

Ask a Question

Get help from others!

© 2022 AnswerBun.com. All rights reserved. Sites we Love: PCI Database, MenuIva, UKBizDB, Menu Kuliner, Sharing RPP, SolveDir