我尝试交叉连接数组,以便为应用中的各种测试方案自动创建数据。以下是要交叉连接的数组(请注意,$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一个)。
我一直认为必须有一种方法可以在不使用循环的情况下完成此操作。有谁知道怎么做?
答案 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) {}
闭包还可以从父作用域继承变量。必须将任何此类变量传递给 use 语言构造。
作为旁注,array_map
旨在将提供的数组(在您的情况下为$scenarioIDs
)转换为不同的数组。你并没有按照它的意思使用它。如果您要做的只是将方案ID作为$data
的关键字附加,请使用此单行:
foreach($scenarioIDs as $id) $data[$id]['sales'] = $base['sales'];