重新安排阵列

时间:2011-10-05 19:05:50

标签: php arrays associative-array

有没有一种干净的方法来安排这个数组,以便密钥成为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行)我也会接受这个答案!

谢谢!

3 个答案:

答案 0 :(得分: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;
}

通常情况下,将数据放在不需要转置它的表单中要好得多。此外,如果您需要转置,请创建一个能够为您完成工作的功能。

答案 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键,但我怀疑这会打扰你。除此之外,我发现它很清楚。