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

読むのは簡単だと思いますが、フィールドごとに 1 回配列全体をループすることになるため、最適なソリューションとは言えません。

個人的には、これはおそらく解決策に固執する状況ですが、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
$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 に答える
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 に答える