如何:array_push进入具有严格层次结构的多个数组?

时间:2014-07-11 18:43:03

标签: php arrays multidimensional-array

我正在尝试为我的firebird数据库构建一个归档类。我已经有过几次以下问题:

我想构建一个像这样的数组结构:

/**
 *  @var [] stores the success log of all db operations
 *
 *  $_log = Array(
 *      (string) [DATA_SOURCE] => Array(
 *          (int) [0] => Array(
 *              (string) [id]       => (int) 32,
 *              (string) [action]   => (string) "update/insert/delete",
 *              (string) [state]    => (int) 1,
 *              (string) [message]  => (string) "success/error",
 *          )
 *      )
 *  )
 */
private $_log = array();

我的1.尝试:

// push result to log array
array_push(
    $this->_log,
    array(
        "archive"   => array(
            "id"        => $row["ID"],
            "action"    => "update",
            "state"     => $success,
        ),
    )
);

结果:

Array(
    [0] => Array(
        [archive] => Array(
            [id] => 32
            [action] => update
            [state] => 1
        )

    )
)

这不是我想要的。我希望“data-source”-key在这里“存档”在推入的条目[0]前面。

MY 2nd TRY

array_push(
    $this->_log["archive"],
    array(
        "id"        => $row["ID"],
        "action"    => "update",
        "state"     => $success,
    )
);

结果

<br />
<b>Warning</b>:  array_push() expects parameter 1 to be array, null given in <b>/Users/rsteinmann/web/intranet/pages/firebird/ArchiveTables.php</b> on line <b>238</b><br />

我对这项任务有点无奈。我也尝试在google或stackoverflow上找到任何东西,但没有什么真正有用的。

如果有人可以帮助我,我会很高兴的!

谢谢你, 圣拉斐尔

1 个答案:

答案 0 :(得分:2)

$this->log['archive'][] = array('id' => ...);

这是实现这一目标的最佳方式。 PHP将为您创建任何不存在的密钥(如archive)。另一方面,array_push是函数调用,并且要求其参数已经存在,它不能为您创建不存在的archive键。在调用函数之前,您必须这样做。

如果您需要一次推送多个参数(array_push),

array_push($arr, $a, $b, $c)非常有用,否则$arr[] = $a是首选的officially recommended语法。