0

多次元配列のネストされた構造クラスを作成する必要があります。これが私の配列です。

Array
(

    [days] => Array
        (
            [0] => Array
                (
                    [rows] => Array
                        (
                            [0] => Array
                                (
                                    [activity_id] => 1
                                    [name] => Activity 2
                                    [city] => London
                                    [info] => fsdsdshgsfd 
                                )

                            [1] => Array
                                (
                                    [activity_id] => 3
                                    [name] => Activity 1
                                    [city] => London
                                    [info] => fsdhgsfd 
                                )
                        )

                )
           [1] => Array
                (
                    [rows] => Array
                        (
                            [0] => Array
                                (
                                    [activity_id] => 3
                                    [name] => Activity 1
                                    [city] => London
                                    [info] => fsdhgsfd 
                                )

                                ...

                                )
                        )
                )

                ...
       )
)

コードを書き直してクラス駆動型にしようとしていますが、それに苦労していItinerary->Days->Rowsます。配列を置き換えるクラス構造を構築する正しい方法は何ですか? 私はこのようなことを試しましたが、それが理にかなっているのかどうかはわかりません.

class Itinerary
{

    private $days = array();

    public static function addDay($day) {
        $this->$days[] = new ItineraryDay($day);
    }
}

class ItineraryDay implements Countable
{

    private $rows = array();

    public static function addRow($row) {
        $this->$rows[] = new ItineraryRow($row);
    }

    public function count()
    {
        return count($this->rows);
    }
}

class ItineraryRow implements Countable
{

    private $name;
    private $city;
    ...

    function __get($key)
    {
        ...
    }

    function __set($key, $value)
    {
        ...
    }

    public function count()
    {
        return count($this->rows);
    }
}


$itinerary1 = new Itinerary(); 

$day1 = new ItineraryDay(); 
$itinerary1->addDay($day1);

$row1 = new ItineraryRow(); 
$day1->addRow($row1);

誰かが私を案内できますか?

4

1 に答える 1

2

それは、最終的にその構造で何をしたいかによって異なりますが、一般的なアイデアとして、私は通常、次のようにします。

class Itinerary implements Countable
{
    private $days;

    public function __construct( array $days = array() )
    {
        $this->setDays( $days );
    }

    public function addDay( ItineraryDay $day )
    {
        $this->days[] = $day;
    }

    public function setDays( array $days )
    {
        $this->days = array();
        foreach( $days as $day )
        {
            $this->addDay( $day );
        }
    }

    public function count()
    {
        return count( $this->days );
    }
}

class ItineraryDay implements Countable
{
    private $rows;

    public function __construct( array $rows = array() )
    {
        $this->setRows( $rows );
    }

    public function addRow( ItineraryRow $row )
    {
        $this->rows[] = $row;
    }

    public function setRows( array $rows )
    {
        $this->rows = array();
        foreach( $rows as $row )
        {
            $this->addRow( $row );
        }
    }

    public function count()
    {
        return count( $this->rows );
    }
}

class ItineraryRow
{
    private $id;
    private $name;
    private $city;
    private $info;

    public function __construct( $id, $name, $city, $info )
    {
        $this->id   = $id;
        $this->name = $name;
        $this->city = $city;
        $this->info = $info;
    }

    /* ... */
}

次に、現在のデータ配列の構造でそれを使用します。

$days = array();
foreach( $originalData[ 'days' ] as $days )
{
    $rows = array();
    foreach( $days[ 'rows' ] as $row )
    {
        $rows[] = new ItineraryRow( $row[ 'activity_id' ], $row[ 'name' ], $row[ 'city' ], $row[ 'info' ] );
    }
    $days[] = new ItineraryDay( $rows );
}
$itinerary = new Itinerary( $days );

または:

$itinerary = new Itinerary;
foreach( $originalData[ 'days' ] as $days )
{
    $day = new ItineraryDay;
    foreach( $days[ 'rows' ] as $row )
    {
        $row = new ItineraryRow( $row[ 'activity_id' ], $row[ 'name' ], $row[ 'city' ], $row[ 'info' ] )
        $day->addRow( $row );
    }
    $itinerary->addDay( $day );
}

そのため、「子」オブジェクトをコンストラクター (新しいオブジェクトを構築するメソッド) に渡すか、構築後にメソッドに追加することができます。オブジェクトを不変にしたい場合、つまり、オブジェクトが構築後にこれ以上行/日を受け入れないようにしたい場合は、、、addDayおよびメソッドを作成するかsetDays、コンストラクターを介して「子」オブジェクトのみを渡すことを許可します。addRowsetRowsprotectedprivate

PeeHaa が既に述べたように、クラス (オブジェクト) の個々のインスタンスではなく、クラス全体で動作するため、静的メソッドは必要ないことに注意してください。実際のところ、静的メソッドを意図したとおりに使用することさえできません$this。これは、クラス全体のコンテキストではなく、オブジェクト コンテキストでのみ使用できるためです。

しかし、正直なところ、この質問は適切に答えるには少し漠然としています。オブジェクトをどのように構築するか、および後でそれらをどのように使用するかについて、もう少し詳しく説明する必要があります。

于 2012-12-27T21:43:38.990 に答える