首页 > 解决方案 > 如何在php中将具有并行属性的数组列表转换为类似对象的数组列表

问题描述

这个问题很难描述。

我需要转换这个数组:

$points = [
    'x' => [1, 3, 5],
    'y' => [2, 4, 6],
];

到这个数组:

$points = [
    ['x' => 1, 'y' => 2],
    ['x' => 3, 'y' => 4],
    ['x' => 5, 'y' => 6],
];

尽可能短的方式。

由于 http 请求格式,我需要此解决方案: http://points-server/?x[]=1&x[]=3&x[]=5

如果有人知道这种转换的名称,那就太好了。

我正在使用Yii2框架,但找不到使用 ArrayHelper 的快速解决方案

标签: phparraysjsonparametersrequest

解决方案


以下逻辑可能会对您有所帮助。

基本上有两种方法可以达到预期的结果。第一个假设标签“x”和“y”可以被硬编码,并用于引用源数组中的不同“点” $points。结果:array $newPoints0

或者,您可以在源数组中更改这些“标签”。为此,我们首先获取键,并以几乎相同的方式重新排列您的源数组。结果:array $newPoints1

<?php

$points = [
    'x' => [1, 3, 5],
    'y' => [2, 4, 6],
];

// use labels 'x' and 'y' (hard coded)
$size = count($points['x']);
for($i=0; $i < $size; $i++) {
    $newPoints0[$i] = ['x' => $points['x'][$i], 'y' => $points['y'][$i]];
}
echo '<pre>';
print_r($newPoints0);
echo '</pre>';

// labels 'x' and 'y' could change (dynamic)
$keys = array_keys($points);
$x = $points[$keys[0]]; // fetch label
$y = $points[$keys[1]]; // fetch label
$size = count($x);
for($i=0; $i < $size; $i++) {
    $newPoints1[$i] = [$keys[0] => $x[$i], $keys[1] => $y[$i]];
}

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

工作演示

输出:

Array
(
    [0] => Array
        (
            [x] => 1
            [y] => 2
        )

    [1] => Array
        (
            [x] => 3
            [y] => 4
        )

    [2] => Array
        (
            [x] => 5
            [y] => 6
        )

)
Array
(
    [0] => Array
        (
            [x] => 1
            [y] => 2
        )

    [1] => Array
        (
            [x] => 3
            [y] => 4
        )

    [2] => Array
        (
            [x] => 5
            [y] => 6
        )

)

推荐阅读