如何将元素推入多维数组的子数组中?

3

我有两个数组

$brands = Array (1=>a, 2=>b);
$titles = Array (1=>d, 2=>e);

我希望您将其转换为一个二维数组。
$both = Array ( [0] => Array ( [brand] => a, [title] => d ) [1] => Array ( [brand] => b, [title] = d ) );

我可以使用一对for循环来完成这个任务,每个循环的形式如下:
$key_brand = 0;

foreach ($brands as $brand) {
    $both[$key_brand++]['brand'] = $brand;
}

但是这种方法似乎很笨拙,特别是如果我想要合并很多这样的数组。我没有看到任何可以满足我的需求的标准PHP函数。有更好的方法吗?


你的数组示例是一些 PHP 和 print_r 结果的变异体。 - Kalle H. Väravas
所以你想要合并两个数组并将内部数组推入?很难理解,不知道在问什么,而且你的例子只使用了 $brands 而没有使用 $titles - Kalle H. Väravas
那会让事情更清晰。现在,为什么你不能立即把它们都变成$both呢?为什么必须分开呢? - Kalle H. Väravas
我正在使用domdocument()获取数据,使用$brands = $xpath->query('//li[@class="cp_item"]/a/p[1]');$titles = $xpath->query('//li[@class="cp_item"]/a/p[2]');,然后按照这里的建议将它们转换为数组。如果有更好的方法可以在不先创建一维数组然后再组合它们的情况下完成,那当然是更好的选择。 - jela
每个数组的计数都是相同的(即,count($brands)将与count($title)等数量相同)。然后我遍历最终数组以清理数据,然后将其插入数据库。由于我使用for each $both as $current进行迭代,所以我认为数组从0或1开始并不重要,并且在设置相关值时迭代计数器可以节省一行代码。这可能不是一个好习惯。 - jela
显示剩余3条评论
2个回答

4
我会从将所有输入信息放入数组开始,这样你就知道要循环的内容:
$old = array(
 'brands' => Array (1=>a, 2=>b),
 'titles' => Array (1=>d, 2=>e)
 // etc
);

然后进行双重循环:

$new = array();
foreach($old as $key => $value) 
{
  foreach ($value as $num_key => $content)
  {
    $new[$num_key][$key] = $content;
  }
}

另一个优点是您可以保留原始数组键。

这是演示“数组转置”。 - mickmackusa

2

以下是我刚刚写的一些可能有帮助的内容。你需要以成对的方式指定参数:

<?php
$brands = array('Foo Global', 'Bar Global');
$titles = array('FooStar 1000', 'BarStar 1000');
$weights = array('400', '600');

function custom_array_merge() {
    $args = func_get_args();
    $arg_len = count($args);

    // Ensure there are no broken pairs. (Not a sophisticated check)
    if ($arg_len < 2 || $arg_len % 2 != 0)
        return FALSE;

    $output = array();

    for ($i = 1; $i <= $arg_len;) {
        $title = $args[$i-1];
        $values = $args[$i];
        foreach ($values AS $key => $value) {
            $output[$key][$title] = $value;
        }
        $i += 2;
    }

    return $output;
}

echo "<pre>";
print_r(custom_array_merge('brand', $brands, 'title', $titles, 'weight', $weights));
echo "</pre>";


示例输出:

Array
(
    [0] => Array
        (
            [brand] => Foo Global
            [title] => FooStar 1000
            [weight] => 400
        )

    [1] => Array
        (
            [brand] => Bar Global
            [title] => BarStar 1000
            [weight] => 600
        )

)

谢谢,最终我使用了Jeroen的稍微简单一些的方法,但这篇文章非常有趣并且运行良好。我以前从未使用过func_get_args(),这很酷。 - jela

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接