2016-03-29 29 views
-2

私はPHPで初心者です。PHP - 単一配列を多次元配列に変換する

APIの目的でデータを送信する必要があります。

私は配列print_r($detail)

このような
Array 
(
    [0] => Array 
     (
      [id] => item1 
     ) 
    [1] => Array 
     (
      [price] => 300 
     ) 
    [2] => Array 
     (
      [quantity] => 1 
     ) 
    [3] => Array 
     (
      [id] => item2 
     ) 
    [4] => Array 
     (
      [price] => 400 
     ) 
    [5] => Array 
     (
      [quantity] => 2 
     ) 
) 

を持っていると私はそれが可能であるどのように

Array 
(
    [0] => Array 
     (
      [id] => item1 
      [price] => 300 
      [quantity] => 1 
     ) 
    [1] => Array 
     (
      [id] => item2 
      [price] => 400 
      [quantity] => 2 
     ) 
) 

のように、別のプロセスに送信する前に、多次元に変換したいですか?このような

+0

むしろそれが今して後で修正するためのより多くのコードを記述しようとしているようにそれを作るよりも、ソースでそれを正しく作りますそれ。この配列をどのように生成しますか? –

+0

ソースを制御できない場合は、最初の配列を手動で反復する必要があります.1つのアイテムの3つのコンポーネントすべてを「収集」するたびに、それらを押し込むことができます。しかし、これはエラーが発生しやすいと感じています。 – Scuzzy

+0

私は他のサーバーから最初の配列を得ました。私はソースに入れません – Vinsens

答えて

0

何かが、それは

$newArray = array(); 
$newRow = array(); 
foreach ($array as $row) { 
    $key = array_keys($row)[0]; 
    $value = array_values($row)[0]; 
    if ($key == 'id') { 
     $newArray[] = $newRow; 
    } 
    $newRow[$key] = $value; 
} 
$newArray[] = $newRow; 
+0

ありがとう、しかし、どのように複数の$キーで実装するのですか? – Vinsens

+0

@Vinsens "multiple $ key"とは何を意味しますか? –

2

あなたが複数のチャンクにあなたの$details配列を分割することができます行う必要があります。 、あなたの詳細配列を指定して

function transformArray(array $initialArray, $chunkSize = 3) { 
    if (count($initialArray) % $chunkSize != 0) { 
     throw new \Exception('The length of $initialArray must be divisible by ' . $chunkSize); 
    } 

    $chunks = array_chunk($initialArray, 3); 
    $result = []; 

    foreach ($chunks as $chunk) { 
     $newItem = []; 

     foreach ($chunk as $item) { 
      $newItem[array_keys($item)[0]] = reset($item); 
     } 

     $result[] = $newItem; 
    } 

    return $result; 
} 

transformArray($details)を呼び出すことになります:私は、カスタムのチャンクサイズを(count($initialArray) % $chunkSize === 0に注意して真でなければならない)を受け入れ、次の関数を書いた

enter image description here

カスタマイズチャンクサイズを使用すると、ソースアレイにさらにデータを追加できます。

$details = [ 
    ['id' => 'item1'], 
    ['price' => 300], 
    ['quantity' => 1], 
    ['anotherProp' => 'some value'], 
    ['id' => 'item2'], 
    ['price' => 400], 
    ['quantity' => 2], 
    ['anotherProp' => 'another value'], 
]; 

functi呼び出しに今transformArray($details, 4);である:それらが同じであるので、あなたには、いくつかの異なるデータを持つことができたときに

enter image description here

0

このバージョンでは、リピートキーを探して、新しい配列を作成します。それが役に立てば幸い。

function customMulti($customArray){ 
    $a = array(); $n = -1; $d; 
    foreach($customArray as $i => $c){ 
    foreach($c as $k => $v){ 
     if(!isset($d)){ 
     $d = $k; 
     } 
     if($k === $d){ 
     $a[++$n] = array(); 
     } 
     $a[$n][$k] = $v; 
    } 
    } 
    return $a; 
} 
$wow = customMulti(array(array('id'=>'item1'),array('price'=>300),array('quantity'=>1),array('id'=>'item2'),array('price'=>400),array('quantity'=>2))); 
print_r($wow); 
1

このバージョンには@PHPglue answerと同じ結果がある可能性があります。しかし、これは1つだけforeachがかかります。私はこれがトップSOユーザーの1人によってここに述べられているように、これがより高速で効率的な方法だと思います。

enter image description here

あなたがそれを望むならば見てみてください。テストのための

Live Demo

<?php 

function explodeArray($arr) 
{ 
    $newArr = array(); 
    foreach($arr as $row) 
    { 
     $key = array_keys($row)[0]; 
     $curArr = count($newArr) > 0 ? $newArr[count($newArr)-1] : array(); 
     if(array_key_exists($key, $curArr)) 
     { 
      array_push($newArr, array($key=>$row[$key])); 
     } 
     else 
     { 
      $index = count($newArr) > 0 ? count($newArr) - 1 : 0 ; 
      $newArr[$index][$key] = $row[$key]; 
     } 
    } 
    return $newArr; 
} 

異なるアレイ。

$detail = array(
     array('id'=>'item1'), 
     array('price'=>300), 
     array('quantity'=>1), 
     array('id'=>'item2'), 
     array('price'=>400), 
     array('quantity'=>2) 
    ); 

var_dump(explodeArray($detail)); 

$detail_match = array(
     array('id'=>'item1'), 
     array('price'=>300), 
     array('quantity'=>1), 
     array('newkey'=>'sample'), 
     array('id'=>'item2'), 
     array('price'=>400), 
     array('quantity'=>2), 
     array('newkey'=>'sample') 
    ); 

var_dump(explodeArray($detail_match)); // Works with any size of keys. 

$detail_diff_key = array(
     array('id'=>'item1'), 
     array('price'=>300), 
     array('quantity'=>1), 
     array('diff1'=>'sample1'), 
     array('id'=>'item2'), 
     array('price'=>400), 
     array('quantity'=>2), 
     array('diff2'=>'sample2') 
    ); 

var_dump(explodeArray($detail_diff_key)); // Works with any size of keys and different keys. 

$detail_unmatch = array(
     array('id'=>'item1'), 
     array('price'=>300), 
     array('quantity'=>1), 
     array('unmatchnum'=>'sample1'), 
     array('id'=>'item2'), 
     array('price'=>400), 
     array('quantity'=>2) 
    ); 

var_dump(explodeArray($detail_unmatch)); 
1

私はこの小さなコードブロックがあなたに役立つと思います。

用途:

$detail = array(
    "0" => array("id" => "item1"), 
    "1" => array("price" => "300"), 
    "2" => array("quantity" => "1"), 
    "3" => array("id" => "item2"), 
    "4" => array("price" => "400"), 
    "5" => array("quantity" => "2"), 
    "6" => array("id" => "item3"), 
    "7" => array("price" => "500"), 
    "8" => array("quantity" => "3") 
); 

$i = 0; 
$j = 0; 
$multi_details = array(); 
while($j < count($detail)){ 
    $multi_details[$i][id] = $detail[$j++][id]; 
    $multi_details[$i][price] = $detail[$j++][price]; 
    $multi_details[$i][quantity] = $detail[$j++][quantity]; 
    $i++; 
} 
echo '<pre>'; 
print_r($multi_details); 
echo '</pre>'; 

出力:

Array 
(
    [0] => Array 
     (
      [id] => item1 
      [price] => 300 
      [quantity] => 1 
     ) 

    [1] => Array 
     (
      [id] => item2 
      [price] => 400 
      [quantity] => 2 
     ) 

    [2] => Array 
     (
      [id] => item3 
      [price] => 500 
      [quantity] => 3 
     ) 

) 
+0

私はエラーが発生しました:不正な文字列オフセット – Vinsens

+0

私に再度チェックさせてください。 –

+0

これは問題ありません。 –