有没有一种干净的方法来安排这个数组,以便密钥成为id?我已经使用几个foreach和一个新数组完成了这几次我放了信息,但是我使用了大约7行代码,并且想知道是否有更清洁的东西。有问题的数组是:
Array (
[0] => Array ( [log_id] => 6 [type] => Test [other_info] => MoreInfo )
[1] => Array ( [log_id] => 5 [type] => Test2 [other_info] => MoreInfo2 )
)
所以我想从上面的数组获得的是:
Array (
[6] => Array ( [type] => Test [other_info] => MoreInfo )
[5] => Array ( [type] => Test2 [other_info] => MoreInfo2 )
)
您可以看到我现在将日志ID作为键。这给我带了几行代码......你是否知道如何在3行或4行中实现这一目标?
或者,是否有更简洁的方法来访问包含我想要的* log_id *的行?我想要给出的用途是我可以访问某个* log_id *的行......在这种情况下,我会用$array[$log_id]
来做...但是如果有一个解决方案可以做到这一点在不改变阵列的情况下(只有1行)我也会接受这个答案!
谢谢!
答案 0 :(得分:3)
您不应该担心代码行,优雅的代码是自我记录的,这意味着您可以阅读它并理解它的作用。它包含所需的最少行,通常需要更长的代码。
与优雅代码相反的是压缩的,含糊的代码,就像 所讨论的数组所需要的那样(我将其放入$data
,Demo ):
$data = array_reduce($data, function($v, $w) { $v[array_shift($w)] = $w; return $v;});
这只是一行代码,但并不优雅。
这可以更好地阅读:
/**
* You can leave a comment here.
* @return array $data keyed with first value of each value
*/
function first_as_key(Array $data)
{
$keyed = array();
foreach($data as $v)
$keyed[array_shift($v)] = $v
;
return $keyed;
}
通常情况下,将数据放在不需要转置它的表单中要好得多。此外,如果您需要转置,请创建一个能够为您完成工作的功能。
答案 1 :(得分:1)
我不确定是否有一个好方法可以做到这一点而不是创建一个新数组(因为如果你只是在现有数组上操作,你可能会发生关键冲突(在你的例子中,如果第一个项目有一个log_id为1?)
可以使用php的create_function
函数将其放入一行,但这对于可读性来说非常糟糕。无论您使用6线还是7线,都可能是最好的方法。
但是出于论证的缘故,这里有一种方法可以使用array_walk在两行中完成:
<?php
$test = array();
$test[] = array('id' => 6, 'data' => 'asdf');
$test[] = array('id' => 7, 'data' => 'qwer');
print_r($test);
$result = array();
array_walk($test, create_function('&$val,$key', 'global $result; $result[$val[\'id\']] = $val;'));
print_r($result);
?>
出于好奇,你是如何创建阵列的?如果它来自任何类型的数据库,最好在添加条目时创建密钥。
答案 2 :(得分:1)
但为什么你需要多个foreach语句?这不会回答你的问题:
$new_arr = array();
foreach ($old_arr as $row) {
$new_arr[$row['log_id']][] = $row;
}
唯一的区别是新行仍然会有log_id键,但我怀疑这会打扰你。除此之外,我发现它很清楚。