交叉连接数组以生成测试场景的数据

时间:2017-08-09 02:47:52

标签: php

我尝试交叉连接数组,以便为​​应用中的各种测试方案自动创建数据。以下是要交叉连接的数组(请注意,$base['sales']已经删除了一些元素,以简化发布此问题的方法):

$base['sales'] = ['shirts'=>1200.0, 'pants'=>1000.0, 'socks'=>1700.0];

$scenarioIDs = range(1, 5);

最终结果应如下所示:

$data[1]['sales'] = ['shirts'=>1200.0, 'pants'=>1000.0, 'socks'=>1700.0];
$data[2]['sales'] = ['shirts'=>1200.0, 'pants'=>1000.0, 'socks'=>1700.0];
$data[3]['sales'] = ['shirts'=>1200.0, 'pants'=>1000.0, 'socks'=>1700.0];
$data[4]['sales'] = ['shirts'=>1200.0, 'pants'=>1000.0, 'socks'=>1700.0];
$data[5]['sales'] = ['shirts'=>1200.0, 'pants'=>1000.0, 'socks'=>1700.0];

我试过这个:

    $data = [];
    array_map(function($scenarioID) {
        $data[$scenarioID]['sales'] = $base['sales'];
    }, $scenarioIDs);
echo '<pre>' . print_r($data, 1) . '</pre>';    
exit();

但获取消​​息Undefined variable: base in C:\xampp\htdocs\Sales\index.php on line 72五次(每个scenarioID一个)。

我一直认为必须有一种方法可以在不使用循环的情况下完成此操作。有谁知道怎么做?

1 个答案:

答案 0 :(得分:1)

要在匿名函数中使用外部上下文中的变量,您需要use关键字:

array_map(
  function($id) use ($base, &$data) {/* fill out the function */},
  $scenarioIDs
);

此语法将在首次调用函数时复制$base,因此,如果您对$base进行更改并尝试使用相同的自定义映射器,则{{1}的新值将为$base 1}}不会被反映出来。因此,如果您需要匿名函数始终使用当前值$base,那么通过引用传递该参数,就像我对$data所做的那样:

function($id) use (&$base, &$data) {}

From the docs:

  

闭包还可以从父作用域继承变量。必须将任何此类变量传递给 use 语言构造。

作为旁注,array_map旨在将提供的数组(在您的情况下为$scenarioIDs)转换为不同的数组。你并没有按照它的意思使用它。如果您要做的只是将方案ID作为$data的关键字附加,请使用此单行:

foreach($scenarioIDs as $id) $data[$id]['sales'] = $base['sales'];