php关联数组求平均值,用PHP关联数组求笛卡儿积

我能想到的是:function inject($elem, $array) {

return array_map(function ($n) use ($elem) { return array_merge((array)$elem, (array)$n); }, $array);}function zip($array1, $array2) {

return array_reduce($array1, function ($v, $n) use ($array2) { return array_merge($v, inject($n, $array2));  }, array());}

function cartesian_product($array) {

$keys = array_keys($array);

$prod = array_shift($array);

$prod = array_reduce($array, 'zip', $prod);

return array_map(function ($n) use ($keys) { return array_combine($keys, $n); }, $prod);}

(下面使用伪数组/列表/字典表示法,因为PHP对于这类事情太冗长了。)

这个inject函数变换a, [b]进[(a,b)],即它向数组的每个值注入一个值,返回一个数组。不管是不是a或b已经是一个数组了,它将始终返回一个二维数组。inject('a', ['foo', 'bar'])

=>  [('a', 'foo'), ('b', 'bar')]

这个zip函数应用inject函数到数组中的每个元素。zip(['a', 'b'], ['foo', 'bar'])

=>  [('a', 'foo'), ('a', 'bar'), ('b', 'foo'), ('b', 'bar')]

请注意,这实际上产生了笛卡尔积,因此zip有点用词不当。简单地将此函数应用于数据集中的所有元素,就可以得到任意长度数组的笛卡儿积。zip(zip(['a', 'b'], ['foo', 'bar']), ['42', '76'])

=>  [('a', 'foo', '42'), ('a', 'foo', '76'), ('a', 'bar', '42'), …]

这不包含键,但是由于元素在结果集中都是按顺序排列的,所以您可以简单地将键重新注入结果。array_combine(['key1', 'key2', 'key3'], ['a', 'foo', '42'])

=>  [ key1 : 'a', key2 : 'foo', key3 : '42' ]

将其应用于产品中的所有元素,将得到所需的结果。

如果您愿意,可以将上述三个函数折叠成一个长语句(这也可以清除错误的名称)。

对于PHP<=5.2没有匿名函数的“展开”版本如下所示:function inject($elem, $array) {

$elem = (array)$elem;

foreach ($array as &$a) {

$a = array_merge($elem, (array)$a);

}

return $array;}function zip($array1, $array2) {

$prod = array();

foreach ($array1 as $a) {

$prod = array_merge($prod, inject($a, $array2));

}

return $prod;}function cartesian_product($array) {

$keys = array_keys($array);

$prod = array_shift($array);

$prod = array_reduce($array, 'zip', $prod);

foreach ($prod as &$a) {

$a = array_combine($keys, $a);

}

return $prod;}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值