2011-10-05 54 views
2

有没有一种干净的方式来安排这个数组,使密钥变成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] ...但是如果有一个解决方案来做到这一点而不改变数组(并且只有一行)我也会接受这个答案呢!

谢谢!

+0

是否有任何原因,你最初不能用log_id构造数组而不必转换它? –

+0

它来自SELECT * FROM查询...我不认为我可以,据我所知。 – luqita

回答

1

但为什么你需要多个foreach语句?这是不是回答你的问题:

$new_arr = array(); 
foreach ($old_arr as $row) { 
    $new_arr[$row['log_id']][] = $row; 
} 

唯一的区别是,新的行仍会有LOG_ID关键,但我怀疑这是怎么回事打扰你。除此之外,我发现它非常清楚。

+0

是的..这是我如何做到这一点......但其中一些有多个fors,如果我有一个结果,其中log_id例如重复,我需要在密钥log_id内另一个数组来保存所有的数据那个log_id。 – luqita

+0

啊,我明白你为什么最初有这个问题。但是有一个简单的解决方法,我已经更新了我的示例以包含它:我添加了'[]',以便$ new_arr [log_id]将始终是一个数组(有时它可能只有一个元素/行,但在我看来这没关系 - 你实际上可以将它们统一处理)。请让我知道这对你有没有用。 – deviousdodo

+0

顺便说一下,使用array_map等的解决方案在这个用例(如果可能的话)中看起来会非常难看。 – deviousdodo

3

你不应该关心代码行,优雅的代码是自我记录,这意味着你可以阅读它,并理解它的作用。它包含了它所需要的最少的行数,这通常需要更长的时间进行编码。

与此相反,以优雅的代码被压缩,神秘的代码,这样其中一个确实您所需要的有问题的阵列(我把它改成$dataDemo):

$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; 
} 

它经常要好得多,在不需要进行转它的形式手头上的数据。此外,如果您需要转置,请为您创建一个可为您完成工作的功能。

+0

@Downvoter:小心分享? – hakre

1

我不知道有一个好的方法来做到这一点,而不是创建一个新的数组(因为如果你只是在现有的数组上操作,你可能会发生关键冲突(在你的例子中,如果第一个项目有1一LOG_ID?)

有可能将此放入使用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); 
?> 

出于好奇,你是如何创建数组?如果它来自任何类型的数据库,那么添加条目时最好创建密钥。