1

我想转换这个。

$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。

4

5 回答 5

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解决方案,但尝试将其包装在一些可重用的函数中。

于 2012-09-04T01:51:49.623 回答
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])));
}
于 2012-09-04T01:48:59.110 回答
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
        )
)
于 2012-09-04T01:36:10.317 回答
1
$final = array();
foreach($data1 as $array) {
  foreach($array as $key => $value) {
    $final[$key] = isset($final[$key]) ? $final : array();
    $final[$key][] = $value;
  }
}
于 2012-09-04T01:39:06.800 回答
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'));
于 2012-09-04T01:56:33.533 回答