$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;
1
ironman55 OP 来人救命呀
|
2
oovveeaarr 2019-04-26 15:57:49 +08:00
用循环好像可以直接做到?
|
3
slgz 2019-04-26 15:59:06 +08:00
意思是根据$a 的 key , 在 $subJect 中取值,?
|
4
ShundL 2019-04-26 15:59:25 +08:00
直接遍历$a 和$b, 从$subject 取值,生成$res
|
5
ironman55 OP @oovveeaarr 怎么做到
|
8
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 ) ) ) ) |
10
qcgzxw 2019-04-26 16:14:43 +08:00
看不出来这是遍历吗
|
11
shiny 2019-04-26 16:17:27 +08:00 2
|
12
ironman55 OP @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; 需要的是通用型,能根据问题改变,而自动产生需要的结果; |
13
ironman55 OP @shiny 我试了下你的代码 差不多了 我还要再微调一下 十分感谢了!!!! 我比较好奇你的思路是怎么想的
我的最终结果: array(1) { ["2019-04-19"]=> array(1) { ["applovin_int"]=> array(1) { ["AE"]=> &array(1) { ["Installs"]=> NULL } } } } |
14
shiny 2019-04-26 16:38:43 +08:00 1
@ironman55 刚才第一遍实现没注意,取了 key,后来又改用 value 当 key,不知道是不是符合你要求。
这个问题我在七年前设计自己的 PHP 模板引擎时候遇到过,当时也苦恼很久,多翻手册,后来就实现了。 |
15
justin2018 2019-04-26 16:45:53 +08:00
@shiny 学习了~ 老铁 666
|
16
jswh 2019-04-26 16:50:31 +08:00
|
17
jswh 2019-04-26 16:50:42 +08:00 1
<?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)); |
18
ironman55 OP @jswh 你的方法我看了下,虽然结果不是完全契合我的需要,但是只要微调就可以做到了,也非常非常非常感谢了!这种迭代的思路虽然看起来相对上面那个方法平民了一点,但是真的很巧妙了~再次非常感谢~谢谢啦
|
19
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']); |
21
Takamine 2019-04-27 11:40:47 +08:00
|
22
Takamine 2019-04-27 12:30:48 +08:00
emmm......感觉好像写麻烦了,对数组 a 的递归还可以再优化一下。
|
23
Takamine 2019-04-27 12:37:06 +08:00
以$a 中的元素去寻找的键值,可以不用人为构造数组移去$subject 内的元素。
$subject = array_diff($subject,[$point=>1]);这个操作可以不要。 |