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 回答