php - Create rows of values from original row keys, and column values (transpose subarray keys & columns)

168

I need to restructure some array data then pass it as a json string to generate a Google line chart.

In the result array, I need to create rows of three elements.

  1. the original element keys which are shared among all rows.
  2. the values from the first row.
  3. the values from the second row.

Input array:

[
    1 => [
        1 => 'c1',
        2 => 'c1',
        3 => 'c1',
        4 => 'c1',
        5 => 'c1'
    ],
    10 => [
        1 => 'c2',
        2 => 'c2',
        3 => 'c2',
        4 => 'c2',
        5 => 'c2'
    ]
]

Expected result is:

[[1,"c1","c2"],[2,"c1","c2"],[3,"c1","c2"],[4,"c1","c2"],[5,"c1","c2"]]
909

Answer

Solution:

Two nested loops should do the trick in this case:

$input = /* your input array */;
$grouped = array();

foreach ($input as $elements) {
    foreach ($elements as $key => $element) {
        $grouped[$key][] = $element;
    }
}

This produces an array that looks like the following:

array(
    1 => array(c1, c2, ...),
    2 => array(c1, c2, ...),
    ...
);

This can the easily be converted to your desired output:

$output = "";
foreach ($grouped as $name => $values) {
    $output .= "['$name'";
    foreach ($values as $value)
        $output .= ", $value";
    $output .= "],\n";
}

Which will produce:

$output = "['1', c1, c2],\n['2', c1, c2]\n,...";
214

Answer

Solution:

the below code will produce string as you wanted

$arr=Array
(
    "1" => Array
        (
            "1" => "c1",
            "2" => "c1",
            "3" => "c1",
            "4" => "c1",
            "5" => "c1",
            "6" => "c1",
            "7" => "c1",
            "8" => "c1",
            "9" => "c1",
            "10" => "c1",
            "11" => "c1",
            "12" => "c1"
        ),
    "10" => Array
        (
            "1" => "c2",
            "2" => "c2",
            "3" => "c2",
            "4" => "c2",
            "5" => "c2",
            "6" => "c2",
            "7" => "c2",
            "8" => "c2",
            "9" => "c2",
            "10" => "c2",
            "11" => "c2",
            "12" => "c2"
        )
);
$ii=0;
foreach($arr as $k =>$val)
{
$ii++;

 for ($i=1; $i <=count($val); $i++) { 
    if($ii == 2 ){
        $f[$i] .= ','.$val[$i] ."],";
    }else
    {
        $f[$i] = "['".$i."',". $val[$i] ;
    }
 }
}

$output = '';
foreach($f as $k => $val)
{
    $output .= $val;
}
echo $output;

output

['1',c1,c2],['2',c1,c2],['3',c1,c2],['4',c1,c2],['5',c1,c2],['6',c1,c2],['7',c1,c2],['8',c1,c2],['9',c1,c2],['10',c1,c2],['11',c1,c2],['12',c1,c2]
905

Answer

Solution:

For output as strings inside array:

<?php
$myArr = array(1 => array(
            1 => 'c1',
            2 => 'c1',
            3 => 'c1',
            4 => 'c1',
            5 => 'c1',
            6 => 'c1',
            7 => 'c1',
            8 => 'c1',
            9 => 'c1',
            10 => 'c1',
            11 => 'c1',
            12 => 'c1'),
    10=> array
        (
            1 => 'c2',
            2 => 'c2',
            3 => 'c2',
            4 => 'c2',
            5 => 'c2',
            6 => 'c2',
            7 => 'c2',
            8 => 'c2',
            9 => 'c2',
            10 => 'c2',
            11 => 'c2',
            12 => 'c2',
        ));
$result = array();
foreach($myArr as $subKey=>$subArr){
    foreach($subArr as $key=>$value){
        if(isset($result[$key])){
            $result[$key] .= $value;
        }else{
            $result[$key] =  $key.' , '.$value.' , ';
        }        
    }
}
var_dump($result);        
?>

output:

array (size=12)
  1 => string '1 , c1 , c2' (length=11)
  2 => string '2 , c1 , c2' (length=11)
  3 => string '3 , c1 , c2' (length=11)
  4 => string '4 , c1 , c2' (length=11)
  5 => string '5 , c1 , c2' (length=11)
  6 => string '6 , c1 , c2' (length=11)
  7 => string '7 , c1 , c2' (length=11)
  8 => string '8 , c1 , c2' (length=11)
  9 => string '9 , c1 , c2' (length=11)
  10 => string '10 , c1 , c2' (length=12)
  11 => string '11 , c1 , c2' (length=12)
  12 => string '12 , c1 , c2' (length=12)
339

Answer

Solution:

Here is an example that will work with any number of arrays:

$array = call_user_func_array( 'array_map', 
    array_merge( 
        array( function() { return func_get_args(); }, array_keys( $array[1] ) ), 
        $array 
    ) 
);

Since the expected output looks like JSON string i will use json_encode:

$output = json_encode( $array ); // [[1,"c1","c2"],[2,"c1","c2"],[3,"c1","c2"],[4, ...
$output = substr( json_encode( $array ), 1, -1 ); // [1,"c1","c2"],[2,"c1","c2"],[3,"c1","c2"],[4, ...

Or if you want the string without the quotes:

$output = array();
foreach( $array as $value ) {
    $output[] = '[' . implode( ',', $value ) . ']';
}
$output = implode( ',', $output ); // "[1,c1,c2],[2,c1,c2],[3,c1,c2],[4,c1,c2], ..."
801

Answer

Solution:

You merely need to include the keys from the first row in your array transposition.

Also, it is crucial that you never manually generate json string by string concatenation (or any other manual method). The surest way to generate a valid json string is to calljson_encode().

Code: (Demo)

echo json_encode(
    array_map(
        null,
        array_keys(current($arr)),
        ...$arr
    )
);

People are also looking for solutions to the problem: php - MSSQL: starting a pre-defined database restore-task with minimal user permissions

Source

Didn't find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Ask a Question

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

Similar questions

Find the answer in similar questions on our website.