我用什么PHP数组函数来转换多维关联数组

时间:2012-09-04 01:28:20

标签: php arrays multidimensional-array

我想转换它。

$data1 = array(
    array('value' => '100.00', 'total' => '32'),
    array('value' => '10.00', 'total' => '13'),
    array('value' => '200.00', 'total' => '39'),
    array('value' => '190.00', 'total' => '11'),
);

进入这个

$data2 = array(
    'value' => array(0 => '100.00', 1 => '10.00', 2 => '200.00', 3 => '190.00'),
    'total' => array(0 => '32', 1 => '13', 2 => '39', 3 => '11')
);

我显然可以通过迭代顶部数组,然后附加到一系列数组,以迂回的方式做到这一点,但我认为必须有一个我不知道的php数组函数可以做到这一点简明地。

http://www.php.net/manual/en/ref.array.php

值是浮点数和整数(如果它有任何区别),我只是在示例代码中将它们添加为字符串,因为它更容易读取IMO。最终数组顺序应与初始顺序匹配。我会给予最少LOC的正确答案,提供的性能并不比“长”版本差得多。 PHP 5.4。

5 个答案:

答案 0 :(得分:5)

如果PHP有一个array_pluck函数,那就很简单了。

function array_pluck(array $array, $field)
{
  return array_map(function($row) use ($field) { return $row[$field]; }, $array);
}

$data2 = array(
  'value' => array_pluck($data1, 'value'),
  'total' => array_pluck($data1, 'total')
);

我认为这和阅读一样简单,但是你会在每个字段上循环整个数组,所以它不是最佳解决方案。

就个人而言,我可能会坚持使用foreach解决方案但尝试将其包含在一些可重复使用的函数中。

答案 1 :(得分:3)

<?php // php 5.4 array syntax

$new = array_reduce($data1, function (&$result, $item)
    {
        $result['value'][] = $item['value'];
        $result['total'][] = $item['total']; 
        return $result;
    },
    ['value' => [], 'total' => []]);

'value'和'total'是任意名称,所以你不会得到一个单行的php库函数来执行此操作。

如果您想要...,您可以将此代码重构为函数。

function array_rotate($data) {
    $k = array_keys($data[0]);
    return array_reduce($data, function (&$r, $i) use ($k) {
        $r[$k[0]][] = $i[$k[0]];
        $r[$k[1]][] = $i[$k[1]]; 
        return $r;
    }, [$k[0] => [], $k[1] => []]);
}

我概括了@ matthew的代码,这允许任意数量的键(而不是2):

function array_rotate2($data) {
    return array_combine(array_keys($data[0]), 
        array_map(function ($field) use ($data) {
              return array_map(function($row) use ($field) { return $row[$field]; }, $data);
            }, array_keys($data[0])));
}

答案 2 :(得分:1)

你可以在没有使用简单的foreach()的函数的情况下完成它:

<?php
$data = array(
    array('value' => '100.00', 'total' => '32'),
    array('value' => '10.00', 'total' => '13'),
    array('value' => '200.00', 'total' => '39'),
    array('value' => '190.00', 'total' => '11'),
);

$newArray = array();
$i=0;
foreach($data as $value){
    $newArray["value"][] = $data[$i]["value"]; 
    $newArray["total"][] = $data[$i]["total"]; 
    $i++;
}

echo "<pre>";
print_r($newArray);
echo "</pre>";
?>

打印出来:

Array
(
    [value] => Array
        (
            [0] => 100.00
            [1] => 10.00
            [2] => 200.00
            [3] => 190.00
        )

    [total] => Array
        (
            [0] => 32
            [1] => 13
            [2] => 39
            [3] => 11
        )
)

答案 3 :(得分:1)

$final = array();
foreach($data1 as $array) {
  foreach($array as $key => $value) {
    $final[$key] = isset($final[$key]) ? $final : array();
    $final[$key][] = $value;
  }
}

答案 4 :(得分:1)

像其他人一样说我不认为有一个单行。这是一个可重用的foreach函数,应该可以正常工作

function array_multi_key_combine($a, $keys = array()) {
    $b = array();
    foreach($a as $v) {
        foreach($keys as $k) {
            if(isset($v[$k])) $b[$k][] = $v[$k];
        }
    }
    return $b;
}
$data2 = array_multi_key_combine($data1, array('value', 'total'));