猿问

如何使用 WordPress (PHP) 编写/读取和删除嵌套数组

我在实现我的计划时遇到了一些问题。我的初始情况如下:


我有一个包含不同内容的数组。在此示例中,它看起来像这样:


$tmp[ get_current_user_id() ] = array(

    'id'      => 5,

    'ref'     => true

);

现在我想使用 WordPress 中的函数将这个数组保存在某个键下,该函数add_post_meta()到目前为止有效:


add_post_meta( $post_id, 'tmp', $tmp );

正如您在上面看到的,我将当前的用户 ID 用作数组的键。如果我现在在我的数组中有 2 个条目并输出它,我有以下方案:


$tmp = get_post_meta( $post_id, 'tmp' );


error_log( print_r( $tmp, true ) );


----------------------------------------


Array

(

    [0] => Array

        (

            [32] => Array

                (

                    [id] => 10

                    [ref] => 

                )


        )

    [1] => Array

        (

            [44] => Array

                (

                    [id] => 20

                    [ref] =>

                )


        )

)

然而,在这一点上,我没有更进一步。对我来说,现在有两个问题:


如何在get_current_user_id()不运行多个循环的情况下使用(作为我的密钥)函数访问正确的数组?

我现在如何删除用户 ID 为 44 的条目,以便我的数组看起来像这样?:

删除后的结果:


Array

(

    [0] => Array

        (

            [32] => Array

                (

                    [id] => 10

                    [ref] => 

                )


        )

)

有一个函数delete_post_meta(),但我不知道它应该如何与嵌套数组一起使用。我非常感谢任何帮助!


天涯尽头无女友
浏览 113回答 1
1回答

慕村225694

add_post_meta&nbsp;(&nbsp;https://developer.wordpress.org/reference/functions/add_post_meta/&nbsp;) 有一个$unique默认为 false 的标志。这就是导致外部数组的原因 - 每次添加一个带有 id 和 ref 的新单元素数组时,它都会被附加到tmp.但是,如果启用$unique,则每次都会覆盖现有数组 - 我认为这也不是您想要的。因此,add_post_meta您应该执行以下操作,而不是使用 :获取tmp帖子元并将其存储在变量中将用户 ID => 值对添加到变量用于update_post_meta覆盖tmp修改后的数组对于get_post_meta,请确保设置$single为 true (第三个参数) - 否则您将再次将其包装在外部数组中):// step 1: retrieve current value of 'tmp' meta$user_list = get_post_meta($post_id, 'tmp', true);if ($user_list === false) { // meta wasn't set yet&nbsp; &nbsp; $user_list = []; // initialize array}// step 2: set information for current user$user_list[ get_current_user_id() ] = [ 'id' => 1337, 'ref' => '...'];// step 3: overwrite 'tmp' post meta with updated arrayupdate_post_meta($post_id, 'tmp', $user_list);然后要删除一个元素,请执行以下操作:$user_list = get_post_meta($post_id, 'tmp', true);if ($user_list === false) { // meta wasn't set yet&nbsp; &nbsp; $user_list = []; // initialize array}// step 2: delete desired user using unset$user_id_to_delete = 44;unset($user_list[ $user_id_to_delete ]);// step 3: overwrite 'tmp' post meta with updated arrayupdate_post_meta($post_id, 'tmp', $user_list);阅读将像这样工作(仅使用get_post_meta):$user_list = get_post_meta($post_id, 'tmp', true);if ($user_list === false) { // meta wasn't set yet&nbsp; &nbsp; $user_list = []; // initialize array}// iterate over all entriesforeach ($user_id => $user_info) {&nbsp; &nbsp; echo "User $user_id: ".json_encode($user_info).'<br/>'.PHP_EOL;}// read a single user's entry:$user_id = 32;echo "User ${user_id}'s entry: ".json_encode( $user_list[$user_id] ).&nbsp; &nbsp; &nbsp;'<br/>'.PHP_EOL;
随时随地看视频慕课网APP
我要回答