PHP 数组问题

2019-04-26 15:51:15 +08:00
 ironman55

$a = ['Date','Media','Geo']; $b = ['Num'];

$subject = ['Date'=>'2019-04-26','Media'=>'AAA','Geo'=>'CN','Num'=>105]; 求一个函数,处理完, 返回结果为 $res['2019-04-26']['AAA']['CN']['Num'] = 105;

$a 和$b 属于可以随意配置的数组,这两个数组的值,一定在 subject 中存在 key;

3931 次点击
所在节点    PHP
24 条回复
ironman55
2019-04-26 15:52:26 +08:00
来人救命呀
oovveeaarr
2019-04-26 15:57:49 +08:00
用循环好像可以直接做到?
slgz
2019-04-26 15:59:06 +08:00
意思是根据$a 的 key , 在 $subJect 中取值,?
ShundL
2019-04-26 15:59:25 +08:00
直接遍历$a 和$b, 从$subject 取值,生成$res
ironman55
2019-04-26 15:59:43 +08:00
@oovveeaarr 怎么做到
ironman55
2019-04-26 16:00:17 +08:00
@slgz $a 其实相当于一个 group by,因为实际代码中还要在累加
ironman55
2019-04-26 16:00:40 +08:00
@ShundL 但是怎么生成多维数组呢
qcgzxw
2019-04-26 16:09:42 +08:00
php > $res[$subject[$a[0]]][$subject[$a[1]]][$subject[$a[2]]][$b[0]] = $subject[$b[0]];
php > print_r($res);

Array
(
[2019-04-26] => Array
(
[AAA] => Array
(
[CN] => Array
(
[Num] => 105
)
)
)
)
ironman55
2019-04-26 16:12:21 +08:00
@qcgzxw 需要的是一个通用的函数,能巧妙处理这个问题的,因为$a 和$b 的数量是可变的
qcgzxw
2019-04-26 16:14:43 +08:00
看不出来这是遍历吗
shiny
2019-04-26 16:17:27 +08:00
ironman55
2019-04-26 16:19:52 +08:00
@qcgzxw 是$a 和$b 的数量和内容是可变的,比如
$a = ['Date'],
$b = ['Income'],
$subject = ['Date'=>'2019-04-26','Media'=>'AAA','Geo'=>'CN','Num'=>105,'Income'=>111];
求出$res['2019-04-26']['Income'] = 111;
需要的是通用型,能根据问题改变,而自动产生需要的结果;
ironman55
2019-04-26 16:29:36 +08:00
@shiny 我试了下你的代码 差不多了 我还要再微调一下 十分感谢了!!!! 我比较好奇你的思路是怎么想的
我的最终结果:
array(1) {
["2019-04-19"]=>
array(1) {
["applovin_int"]=>
array(1) {
["AE"]=>
&array(1) {
["Installs"]=>
NULL
}
}
}
}
shiny
2019-04-26 16:38:43 +08:00
@ironman55 刚才第一遍实现没注意,取了 key,后来又改用 value 当 key,不知道是不是符合你要求。
这个问题我在七年前设计自己的 PHP 模板引擎时候遇到过,当时也苦恼很久,多翻手册,后来就实现了。
justin2018
2019-04-26 16:45:53 +08:00
@shiny 学习了~ 老铁 666
jswh
2019-04-26 16:50:31 +08:00
jswh
2019-04-26 16:50:42 +08:00
<?php

function solution($a, $b, $subject) {
$keys = array_merge($a, $b);
$values = [];
foreach($keys as $key) {
$values[] = $subject[$key];
}
return array_seq($values);
}
function array_seq($arr) {
$count = count($arr);

if ($count < 2) {
throw new \Exception('error count');
} elseif ($count == 2) {
return [$arr[0] => $arr[1]];
} else {
$key = $arr[0];
array_shift($arr);

return [$key => array_seq($arr)];
}

}
$a = ['Date','Media','Geo']; $b = ['Num'];

$subject = ['Date'=>'2019-04-26','Media'=>'AAA','Geo'=>'CN','Num'=>105];
var_dump(solution($a, $b, $subject));
ironman55
2019-04-26 18:23:20 +08:00
@jswh 你的方法我看了下,虽然结果不是完全契合我的需要,但是只要微调就可以做到了,也非常非常非常感谢了!这种迭代的思路虽然看起来相对上面那个方法平民了一点,但是真的很巧妙了~再次非常感谢~谢谢啦
alex321
2019-04-26 19:02:24 +08:00
<?php
$a = ['Date','Media','Geo'];
$b = ['Num'];
$subject = ['Date'=>'2019-04-26','Media'=>'AAA','Geo'=>'CN','Num'=>105];

$indexs = array_reverse(array_merge($a, $b));

$result = [];
$last_key = '';

$i = 0;
foreach($indexs as $index) {
$_key = $subject[$index];
if ($i == 0) {
$result = [$index => $_key];
$last_key = $index;
} else {
$result[$_key] = $result;

if (isset($result[$last_key])) {
unset($result[$last_key]);
}

$last_key = $_key;
}
$i++;
}

#print_r(var_export($result, true));
print_r($result['2019-04-26']['AAA']['CN']['Num']);
alex321
2019-04-26 19:34:01 +08:00
@alex321 #19 如果要直出最终的那个值,用 array_value 和 is_array 递归一下。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/558972

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX