1

id、parent_id、およびnameフィールドを持つテーブルがあります。
親には多くの子を含めることができますが、子には1つの親しかありません。

フェッチすると、配列は次のようになります。

Array
(
[0] => Array
    (
        [id] => 1
        [parent_id] => 0
        [name]=>firstName
    )

[1] => Array
    (
        [id] => 2
        [parent_id] => 1
        [name]=>childFirstName
    )

[2] => Array
    (
        [id] => 3
        [parent_id] => 0
        [name]=>SecondName
    )

[3] => Array
    (
        [id] => 4
        [parent_id] => 3
        [name]=>childSecondName
    )


)

この表から、フラット配列が必要です。これは次のようになります。

//配列のキーはテーブル行のIDであり、idに対応する値はparent_name>nameです。

Array
 ( 
   [1]=>[firstName],// [row_id]=>[name with parent]
   [2]=>[firstName>childFirstName],
   [3]=>[secondName],
   [4]=>[secondName>childSecondName]
 )
4

2 に答える 2

0

$itemsを$iに入れ、新しい配列がforeachで$ nであるとすると、次を使用します。

foreach($items as $i){
    $p = $i['parent_id'];
    $n[$i['id']]=($p == 0) ? [$i['name']]: [$n[$p][0]=>$i['name']];
}

これは、親に親がいない場合にのみ機能します。より慎重なコードとして、

foreach($items as $i){
    $p = $i['parent_id'];
    if($p == 0){                           //if no parent
        $n[$i['id']]=[$i['name']];
        continue;
    }                                     // if has parent from now on...
    $k = array_keys($n[$p]);              // if parent has a parent we have to
    $k = $k[0];                           // get the correct key for name
    $n[$i['id']]=[$n[$p][$k]=>$i['name']];
}

上記のコードが複数の階層レベルで機能するようにします。

于 2013-03-06T07:29:11.533 に答える
0
<?php

$arr=array(
array("id" => 1, "parent_id" => 0, "name"=>"firstName"),
array("id" => 2, "parent_id" => 1, "name"=>"childFirstName"),
array("id" => 3, "parent_id" => 0, "name"=>"SecondName"),
array("id" => 4, "parent_id" => 3, "name"=>"childSecondName")
);

class test
{
  var $arr=array();

  function get_name($id)
  {
     $str='';
     if(isset($this->arr[$id]))
     {
        $parent_id=$this->arr[$id]['parent_id'];
        if($parent_id!=0) $str=$this->get_name($parent_id).'>';
        $str.=$this->arr[$id]['name'];
     }
     return $str;
  }

  function convert($arr)
  {
     foreach($arr as $row)
     {
       $this->arr[$row['id']]=$row;
     }

     reset($this->arr);
     $res=array();
     foreach($this->arr as $id=>$row)
     {
       $res[$id]=$this->get_name($id);
     }
     return $res;
  }
}

$c=new test();
$res=$c->convert($arr);
print_r($res);
于 2013-03-06T07:37:35.540 に答える