2

I have the following two-dimensional array:

01 03 02 15
05 04 06 10
07 09 08 11
12 14 13 16

I want to convert columns to rows then reduce the matrix to a string like the following:

01,05,07,12|03,04,09,14|02,06,08,13|15,10,11,16
0

5 Answers 5

7

I'm assuming that you have this array:

$array = array (
  array ('01','03','02','15'),
  array ('05','04','06','10'),
  array ('07','09','08','11'),
  array ('12','14','13','16')
);

In which case, you can do this:

$tmpArr = array();
foreach ($array as $sub) {
  $tmpArr[] = implode(',', $sub);
}
$result = implode('|', $tmpArr);
echo $result;

See it working

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

1 Comment

This answer is provably incorrect because it does not transpose the data. Proof
3
$input = array(
    array('01', '02', '03', '04'),
    array('11', '12', '13', '14'),
    array('21', '22', '23', '24'),
    array('31', '32', '33', '34'),
);
$newArray = array();
foreach($input as $rowIndex => $row) {
    foreach($row as $key => $val) {
        if(!$newArray[$key]) {
            $newArray[$key] = array();
        }
        $newArray[$key][$rowIndex] = $val;
    }
}
$strRows = array();
foreach($newArray as $key => $row) {
    $strRows[$key] = join(',', $row);
}
$output = join('|', $strRows);

1 Comment

This answer generates multiple undefined array key Warnings. Proof
1

The most elegant script for this "transpose and double-implode" task is to call array_map() with a spread operator on the input array, then join the columns with commas, the join the joined strings with pipes.

Code: (Demo)

var_export(
    implode(
        '|',
        array_map(
            fn() => implode(',', func_get_args()),
            ...$input
        )
    )
);

Or collect all of the column data in the function signature. (Demo)

var_export(
    implode(
        '|',
        array_map(
            fn(...$column) => implode(',', $column),
            ...$input
        )
    )
);

For similar questions that do not require a single string of output, but prefer an array of delimited strings, simply remove the outer implode() call. Namely:

Comments

0

Given your array as $myArray, like this:

$newArray = array();
foreach ($myArray as $row) {
    $rowValue = implode(',', $row);
    $newArray[] = $rowValue;
}
$finalString = implode('|', $newArray);

1 Comment

This answer is provably incorrect because it does not transpose the data. Proof
0

Looking at the solutions proposed so far, only one actually generates the correct output requested by the OP.

So, stealing unashamedly from salathe's neat conversion, but with a transpose to provide the correct result:

$input = array ( 
    array ('01','03','02','15'), 
    array ('05','04','06','10'), 
    array ('07','09','08','11'), 
    array ('12','14','13','16'), 
); 

function transpose($array) {
    array_unshift($array, null);
    return call_user_func_array('array_map', $array);
}

$transposed = transpose($input);

echo implode('|', array_map('implode', $transposed, array_fill(0, count($transposed), ','))); 

1 Comment

While this answer DOES transpose the array data; as of PHP8 its implementation of implode() causes a Fatal error. Proof

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.