12

I have two arrays one for keys and another for values. The values array is an array of array.

Keys array:

$keyArray = array("clientId","clientName","clientAdsress","clientPhone");

Values array:

$valuesArray = array(
                "0"=>array("1001","aaaaa","ddddddd","22222222"),
                "1"=>array("1002","bbbbbb","ddddddd","11111111"),
                "2"=>array("1003","ccccc","ddddddd","33333333")
              );

Expected Output:

$finalData = array(
                    "clientId"=>array("1001","1002","1003"),
                    "clientName"=>array("aaaaa","bbbbbb","ccccc"),
                    "clientAdsress"=>array("ddddddd","ddddddd","ddddddd"),
                    "clientPhone"=>array("22222222","11111111","33333333")
                  );

I have tried this code:

$finalData = array();
for($i=0;$i<count($keyArray);$i++){

    for($j=0;$j<count($valuesArray);$j++){
        $rowArray = $valuesArray[$j];
       $finalData[$keyArray[$i]] = array($rowArray[$i]);
    }
}

echo '<pre>';print_r($finalData);echo '</pre>';

Output:

Array
(
    [clientId] => Array
        (
            [0] => 1003
        )

    [clientName] => Array
        (
            [0] => ccccc
        )

    [clientAdsress] => Array
        (
            [0] => ddddddd
        )

    [clientPhone] => Array
        (
            [0] => 33333333
        )

)

I am getting the last values of arrays. How can I get my expected output?

2
  • What does the $finalData format buy you? It looks less manageable and obvious than the 'rows' style: $valuesArray? Commented Mar 6, 2019 at 22:24
  • Actually, I have required Expected Output type format in my project. Commented Mar 7, 2019 at 7:58

4 Answers 4

10

A simple foreach solution:

https://3v4l.org/gbBad

<?php

$keyArray = array("clientId", "clientName", "clientAdsress", "clientPhone");
$valuesArray = array(
    "0" => array("1001", "aaaaa", "ddddddd", "22222222"),
    "1" => array("1002", "bbbbbb", "ddddddd", "11111111"),
    "2" => array("1003", "ccccc", "ddddddd", "33333333")
);
$expected = array(
    "clientId" => array("1001", "1002", "1003"),
    "clientName" => array("aaaaa", "bbbbbb", "ccccc"),
    "clientAdsress" => array("ddddddd", "ddddddd", "ddddddd"),
    "clientPhone" => array("22222222", "11111111", "33333333")
);

$result = [];
foreach ($keyArray as $key => $keyName) {
    foreach ($valuesArray as $value) {
        $result[$keyName][] = $value[$key];
    }
}

var_dump($result === $expected);

Output for 7.1.25 - 7.3.2

bool(true)

Sign up to request clarification or add additional context in comments.

1 Comment

Don't just post code, explain what was wrong with the OP's code and how you fixed it.
8

One way to do it is with array_combine and array_column:

$finalData = array_combine($keyArray, array(array_column($valuesArray, 0),
                                            array_column($valuesArray, 1),
                                            array_column($valuesArray, 2),
                                            array_column($valuesArray, 3)));
print_r($finalData);

Output:

Array ( 
    [clientId] => Array ( [0] => 1001 [1] => 1002 [2] => 1003 )
    [clientName] => Array ( [0] => aaaaa [1] => bbbbbb [2] => ccccc )
    [clientAdsress] => Array ( [0] => ddddddd [1] => ddddddd [2] => ddddddd )
    [clientPhone] => Array ( [0] => 22222222 [1] => 11111111 [2] => 33333333 ) 
)

Demo on 3v4l.org

3 Comments

$valuesArray is a dynamic array. there may more or fewer row.
I have checked it, it's working perfectly. Thanks :)
@Nick - I also offer this more dynamic way: for ($i = 0; $i < count($keyArray); $i++) $arr[] = array_column($valuesArray, $i); $finalData = array_combine($keyArray, $arr); This way it will work whatever num of keys the OP has
5

Building on Nick's answer, a simpler solution that doesn't require hardcoding the number of keys would be:

$finalData = array_combine($keyArray, array_map(null, ...$valuesArray));

(Demo on 3v4l.org)

Basically, this first transposes the two-dimensional $valuesArray using array_map as described in this answer, changing the columns into rows and vice versa, and then combines the result with $keyArray using array_combine as in Nick's answer.

Comments

2
<?php
$keyArray = array(
    "clientId","clientName","clientAdsress","clientPhone"
);

$valuesArray = array(
    "0"=>array("1001","aaaaa","ddddddd","22222222"),
    "1"=>array("1002","bbbbbb","ddddddd","11111111"),
    "2"=>array("1003","ccccc","ddddddd","33333333")
);
foreach($keyArray as $keyIndex => $keyName)
    $finalData[$keyName] = array_column($valuesArray, $keyIndex);

print_r($finalData);

Output:

Array
(
    [clientId] => Array
        (
            [0] => 1001
            [1] => 1002
            [2] => 1003
        )

    [clientName] => Array
        (
            [0] => aaaaa
            [1] => bbbbbb
            [2] => ccccc
        )

    [clientAdsress] => Array
        (
            [0] => ddddddd
            [1] => ddddddd
            [2] => ddddddd
        )

    [clientPhone] => Array
        (
            [0] => 22222222
            [1] => 11111111
            [2] => 33333333
        )

)

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.