将两个平面数组转置为一个具有关联行的索引数组

问题描述 投票:0回答:4

使用 PHP,我需要合并 2 个数组(长度相等到一个关联数组),这是我当前数据集的摘录:

[1] => Array
    (
        [0] => C28
        [1] => C29
    )

[2] => Array
    (
        [0] => 1AB010050093
        [1] => 1AB008140029
    )

两个元素 [1] 和 [2] 实际上比 2 个子元素长很多(就像我说的,这是摘录)。

问题是第一个数组中的“C28”对应于第二个数组中的“1AB010050093”,依此类推...我需要的结果是创建一个如下所示的新关联数组:

[1] => Array    
    (
        ['ref']  => C28
        ['part'] => 1AB010050093
    )
[2] => Array
    (
        ['ref'] => C29
        ['part'] => 1AB008140029
    )

等等...

php arrays multidimensional-array transpose associative-array
4个回答
4
投票

如果您愿意妥协于这样的数组结构:

array(
    'C28' => '1AB010050093',
    'C29' => '1AB008140029'
);

然后您就可以使用

array_combine()
键盘演示):

array_combine($refNumbers, $partIds);

否则,您需要使用 foreach (Codepad Demo):

$combined = array();

foreach($refNumbers as $index => $refNumber) {
    if(!array_key_exists($index, $partIds)) {
        throw OutOfBoundsException();
    }

    $combined[] = array(
        'ref'  => $refNumber,
        'part' => $partIds[$index]
    );
}

0
投票

如果您使用 PHP 5.5+,有一个名为

array_column()
的新方法,它将获取特定列中的所有值。尽管我认为简单的 foreach 循环可能仍然是您最好的选择,但这可能会被使用。


0
投票

怎么样:

$arr1 = array(
    0 => 'C28',
    1 => 'C29',
);

$arr2 = array(
    0 => '1AB010050093',
    1 => '1AB008140029',
);
$result = array();
for ($i=0; $i<count($arr1); $i++) {
    $result[] = array('ref' => $arr1[$i], 'part' => $arr2[$i]);
}
print_r($result);

输出:

[1] => Array
    (
        [0] => C28
        [1] => C29
    )

[2] => Array
    (
        [0] => 1AB010050093
        [1] => 1AB008140029
    )

0
投票

您可以通过在

get_defined_vars()
调用内部调用
array_map()
来避免在访问和声明数据时重复键的名称。 演示

$array = [
    ['C28', 'C29'],
    ['1AB010050093', '1AB008140029'],
];

var_export(
    array_map(
        fn($ref, $part) => get_defined_vars(),
        ...$array
    )
);

如果您有单独的平面输入数组,则可以单独传递它们。 演示

$refs = ['C28', 'C29'];
$parts = ['1AB010050093', '1AB008140029'];

var_export(
    array_map(
        fn($ref, $part) => get_defined_vars(),
        $refs,
        $parts
    )
);

输出(无论哪种方式):

array (
  0 => 
  array (
    'ref' => 'C28',
    'part' => '1AB010050093',
  ),
  1 => 
  array (
    'ref' => 'C29',
    'part' => '1AB008140029',
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.