【问题标题】:Re-arranging an array重新排列数组
【发布时间】:2011-10-05 19:05:50
【问题描述】:

有没有一种干净的方法来排列这个数组,以便键变成 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 ) 
)

你可以看到我现在把 log id 作为 key。这需要我写几行代码......你知道如何最多用 3 或 4 行代码来实现吗?

或者,是否有更简洁的方法来访问包含我想要的 *log_id* 的行?我想给它的用途是我可以访问某个 *log_id* 的行...在这种情况下,我会使用 $array[$log_id]... 但如果有解决方案可以做到这一点而无需更改数组(并且只有 1 行)我也会接受它作为答案!

谢谢!

【问题讨论】:

  • 有什么理由你不能用 log_id 构造数组而不是转换它?
  • 它来自 SELECT * FROM 查询...据我所知,我认为我做不到。

标签: php arrays associative-array


【解决方案1】:

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

与优雅代码相反的是压缩的、神秘的代码,就像这个你所需要的数组的代码(我把它放到$dataDemo): p>

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

通常情况下,以不需要转置的形式拥有手头的数据会好得多。此外,如果您需要转置,请自己创建一个可以为您完成这项工作的函数。

【讨论】:

    【解决方案2】:

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

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

    唯一的区别是新行仍然有 log_id 键,但我怀疑这会打扰你。除此之外,我觉得很清楚。

    【讨论】:

    • 是的..我就是这样做的......但是如果我有一个结果,例如 log_id 重复,它们中的一些有多个 fors,我需要在键内创建另一个数组log_id 保存具有该 log_id 的所有数据。
    • 啊,我明白你最初为什么会遇到问题了。但是有一个简单的解决方法,我更新了我的示例以包含它:我添加了 [] 以便 $new_arr[log_id] 将始终是一个数组(有时它可能只有一个元素/行,但这在我看来没关系-您实际上可以统一对待它们)。让我知道它是否适合您。
    • 顺便说一句,使用 array_map 等的解决方案在这个用例中看起来很丑(如果可能实现的话)。
    【解决方案3】:

    我不确定是否有一种好方法可以做到这一点,而不是创建一个新数组(因为如果您只是对现有数组进行操作,您可能会遇到键冲突(在您的示例中,如果第一个项目有一个log_id 为 1?)

    可以使用 php 的create_function 函数将其放在一行中,但这对可读性很不利。不管你有什么,使用 6 或 7 行可能是最好的方法。

    但是为了论证的缘故,这里有一种方法可以使用 array_walk 在 2 行中完成:

    <?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);
    ?>
    

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

    【讨论】:

      猜你喜欢
      • 2012-08-11
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 2022-06-12
      • 1970-01-01
      • 2015-06-20
      相关资源
      最近更新 更多