2017-11-08 7 views
1

私は配列の配列を持っていて、それをテーブルに表示したいのですが、効率的な表示方法はありますか?PHPのギザギザのアソシエート配列を扱う簡潔な方法はありますか

Array 
    (
    [0] => Array 
    (
     [sku] => 1234 
     [upc] => 6-00000--5 
     [measure_amount] => 30 
     [strength] => 100 mg 
    ) 
    [1] => Array 
    (
     [sku] => 5432 
     [upc] => 6-00000-05432-1 
    ) 
) 

すべての製品のテーブルを出力したいのですが、キーが存在しない場合は空白の項目を表示してください。今、私が考えることのできる唯一の方法は、すべてのアイテムを繰り返し実行し、array_keysを取得し、マスターキーリストに結合してからキーリストを使用してテーブルを生成する方法ですが、この:

に上記の変換:私はアイテムのリストを反復処理として、モデル連想配列との配列をマージするように私は、これまでより良いアプローチがあると確信している

Array 
    (
    [0] => Array 
    (
     [sku] => 1234 
     [upc] => 6-00000--5 
     [measure_amount] => 30 
     [strength] => 100 mg 
    ) 
    [1] => Array 
    (
     [sku] => 5432 
     [upc] => 6-00000-05432-1 
     [measure_amount] => 
     [strength] => 
    ) 
) 

。 ..しかし、私はそれを動作させるように見えることはできません。

+1

1両方とも「0」のキーがあるので、あなたの例は機能しません。第2の質問はそのモデル配列を表示する必要があります。 – Forbs

+0

2番目の配列を作成するには、マスターキーリストを取得するために説明する反復処理を行う必要があります。したがって、テーブルを作成しているときと配列を変更しているときのどちらを行うかは、実際には関係ありません。 – Barmar

+0

ありがとう@Forbsコピー&ペーストの誤字。 – Armstrongest

答えて

0

元の配列のキーに頼るのではなく、作成するテーブルの列を持つ2番目の配列を作成することをお勧めします。それで、次のようにループすることができます。

$columns = array("sku","upc","measure_amount","strength"); 
foreach($mainArray as $a) 
{ 
    foreach($columns as $col) 
    { 
     //Access the array element like this: $a[$col] 
    } 
} 

注:これは、キーが事前にわかる場合にのみ機能します。

+0

ええと...時間が経つにつれてキーが変化しないことを保証することはできません。 – Armstrongest

1

あなたはarray_mergeと組み合わせてarray_mapを活用することができます

$data = [ 
    ['sku' => 1, 'upc' => 'foo', 'measure_amount' => 30, 'strength' => '100mg'], 
    ['sku' => 2, 'upc' => 'bar'], 
]; 

$clean = array_map(function ($entry) use ($complete_item) { 
    $all_keys = array_keys($complete_item); 
    $empty = array_combine($all_keys, array_fill(0, count($all_keys), '')); 
    return array_merge($empty, $entry); 
    }, 
    $data 
); 

この意志の出力を:

array(2) { 
    [0]=> 
    array(4) { 
    ["sku"]=> 
    int(1) 
    ["upc"]=> 
    string(3) "foo" 
    ["measure_amount"]=> 
    int(30) 
    ["strength"]=> 
    string(5) "100mg" 
    } 
    [1]=> 
    array(4) { 
    ["sku"]=> 
    int(2) 
    ["upc"]=> 
    string(3) "bar" 
    ["measure_amount"]=> 
    string(0) "" 
    ["strength"]=> 
    string(0) "" 
    } 
} 
+0

事前にキーがわからない場合はこれを行うことができますか?時間の経過とともに新しい属性が追加されるとキーが変わるので、私は柔軟なソリューションを求めていました。 – Armstrongest

+0

最も完全なオブジェクト(すべてのキーを定義しているオブジェクト)を選択できたら、はい、返信を更新します – machour

1

うーん...今、あなたの投稿が理にかなって、あなたはランダムなフィールドを持つエントリを持っています各要素が同じフィールドを持つ配列を返すことを望みます。ここで私は、関数があると確信している...強引な方法ですが、私はわからないんだけど...

$merge = array(); 
// Run the array for all the fields and put them in merge. 
foreach($array1 as $val) 
{ 
    $merge = array_merge($merge,$val); 
} 
// Now run merge to set to a default...This probably has a function I don't use 
foreach($merge as $key=>$val) 
{ 
    $merge[$key] = ''; 
} 
// Now Use Merge to put it all back 
foreach($array1 as $key=>$val) 
{ 
     $array1[$key] = array_merge($merge,$val); 
} 
// Your array1 now contains rows with all the same elements and in the same order. 
1

このソリューションは、サブアレイおよび/またはサブアレイ内の要素の数が多いの多数のためのより良いです、それは追加の空の要素を格納するための追加のメモリを必要としないので:

を今、私はこれをやって考えることができる唯一の方法は、 を通じてすべての項目を反復array_keysを取得し、マスターキーのリストにそれらを組み合わせることです キーリストを使用してテーブルを生成します。

使用これは、特定のキーがサブアレイにどうなるか事前にわからない場合は、可能なすべてのキーを収集するには:

foreach ($mainArray as $subArray) { 
    foreach ($subArray as $key=>$val) { 
     if (!isset($allKeys[$key])) { 
     $allKeys[$key] = ''; 
     } 
    } 
} 

次に、ループ内に空の表のセルを印刷するif (!isset($allKeys[$currentSubarrayKey]))チェックを使用issetin_arrayよりもはるかに高速に動作するためです。

+0

データに異なる順序のキーがあると、結果としてキーが追加されますランダムな順序で右か? – Forbs

+0

'$ allKeys'配列のキーはランダムな順序になります。 – camelsWriteInCamelCase

+0

この場合、ソートされたキーを持っていないのは、ソート・アルゴを使っていつでも実行できるので、取引遮断器ではありませんが、これは賢明な簡潔なコードです。私はそれをテストするつもりです。 – Armstrongest

関連する問題