0

次のような db 行があるとします。

group    version  tool         info
group_a  m        screwdriver  for screwing things
group_a  m        hammer       for hitting things
group_a  l        screwdriver  for screwing things
group_a  xl       screwdriver  for screwing things
group_b  m        screwdriver  for screwing things
group_b  m        hammer       for hitting things
group_b  m        wrench       for wrenching things
group_b  l        screwdriver  for screwing things
group_b  xl       wrench       for wrenching things

そこから、次のような配列を作成したいと思います。

array(
    array( 'id' => 'group_a',
        array( 'id' => 'm',
            array( 'id' => 'screwdriver',
                'info' => 'for screwing things'
            ),
            array( 'id' => 'hammer',
                'info' => 'for hitting things'
            ),
        ),
        array( 'id' => 'l',
            array( 'id' => 'screwdriver',
                'info' => 'for screwing things'
            ),
        ),
        array( 'id' => 'xl',
            array( 'id' => 'screwdriver',
                'info' => 'for screwing things'
            ),
        )
    array( 'id' => 'group_b',
        array()
    )
    ~~~~~~~ etc ~~~~~~~
);

ちょっとした文脈のために、これを Zend から BackboneJS に JSON として渡します。BackboneJS は、これらの配列をグループ コレクションに消費します。グループ コレクションには、n 個のツール モデルを含む n 個のバージョン コレクションが含まれます。

どんな点でも喜んで明確にします。

乾杯。

4

2 に答える 2

0

狂ったように通知を投げるので、私はこれが本当に好きではありません。しかし、最終結果は次のようになります。

$array = array();
while($row = fetch($query) {
  $array['id'][$row['group']]['id'][$row['version']]['id'] = $row['tool'];
  $array['id'][$row['group']]['id'][$row['version']]['info'] = $row['info'];
}

issets を使用してよりエレガントにし、代わりに上書きや追加を防ぐためのチェックを行います。

一意性を高めるために、単語の代わりに実際の ID をキーとして使用することもあるでしょう。

とにかく、これは正しい方向に考えるのに役立つはずです。

于 2013-02-23T18:23:20.960 に答える
0

データを 3 次元の一時配列に変換します。

$temparray=array();
foreach ($rows as $row) {
  $temparray[$row['group']][$row['version']][$row['tool']]=$row['info'];
}

この一時的な配列は、達成しようとしているものと似ていますが、完全ではありません。

Array
(
    [group_a] => Array(
            [m] => Array(
                    [screwdriver] => for screwing things
                    [hammer] => for hitting things
                )
            [l] => Array(
                    [screwdriver] => for screwing things
                )
            [xl] => Array(
                    [screwdriver] => for screwing things
                )
    )
    [group_b] => Array(
            [m] => Array(
                    [screwdriver] => for screwing things
                    [hammer] => for hitting things
                    [wrench] => for wrenching things
                )
            [l] => Array(
                    [screwdriver] => for screwing things
                )
            [xl] => Array(
                    [wrench] => for wrenching things
                )
    )
)

これでニーズに十分であるか、vwが示した正確な構造を再現する必要があります。後者の場合、その一時的な配列をループして目標を達成します。

foreach ($temparray as $groupid=>$groupdata) {
  $grouparray=array('id'=>$groupid);
  foreach ($groupdata as $versionid=>$versiondata) {
    $versionarray=array('id'=>$versionid);
    foreach ($versiondata as $toolid=>$tooldata) {
      $toolarray=array('id'=>$infoid,'info'=>$tooldata);
      $versionarray[]=$toolarray;
    }
    $grouparray[]=$versionarray;
  }
  $targetarray[]=$grouparray;
}

そして、あなたは完了です:)

ところで、インデックスとして 'id',0,1,2,... を持つ配列は少し厄介です。私は BackboneJS を知りませんが、そのような形式を使用するスクリプトは (temptable がどのように見えるかではなく) 非常に疑わしく見えます。

于 2013-02-23T23:34:42.560 に答える