转置2d数组,用逗号连接第二层,用管道连接第一层


Transpose 2d array, join second level with commas, and join first level with pipes

我有以下二维数组:

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

我想将列转换为行,然后将矩阵简化为如下字符串:

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

我假设您有这个数组:

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

在这种情况下,你可以这样做:

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

查看它的工作

$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);

这个"转置和双重内爆";任务是在输入数组上使用扩展运算符调用array_map(),然后用逗号连接列,用管道连接连接的字符串。

代码:(演示)

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

或者收集函数签名中的所有列数据。(演示)

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

对于不需要单个输出字符串,但更喜欢使用分隔字符串数组的类似问题,只需删除外部内爆()调用即可。即:

  • (2015)将assoc数组转换为两个不同的数组并将其连接
  • (2017)如何在多维数组中转置和内爆子数组数据以创建平面输出数组
  • (2018)php将数组值连接到新数组php中
  • (2019)转换多维数组并用逗号连接值

给定您的数组为$myArray,如下所示:

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

查看到目前为止提出的解决方案,只有一个解决方案实际生成了OP要求的正确输出。

因此,厚颜无耻地从salath的巧妙转换中窃取,但使用转置来提供正确的结果:

$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), ',')));