循环时向数组添加字段和值?

Posted

技术标签:

【中文标题】循环时向数组添加字段和值?【英文标题】:add field and value to array while looping through? 【发布时间】:2022-01-15 05:12:04 【问题描述】:

我有以下 2 个数组,我需要根据第二个数组的 ID 值添加第一个数组的值作为 Key,以便我可以订购第二个数组 DESC:

$视图:

Array ( [1851] => 12 [14341] => 7 [17834] => 3 )

我有以下数组对象:

$most_seen_list :

Array ( 
    [0] => WP_Post Object ( 
            [ID] => 17834 
            [post_date] => 2021-10-20 16:01:50 
            [post_date_gmt] => 2021-10-20 21:01:50 
        )
    [1] => WP_Post Object ( 
            [ID] => 14341 
            [post_date] => 2021-06-01 17:57:00 
            [post_date_gmt] => 2021-06-01 22:57:00 
        )
    [2] => WP_Post Object ( 
            [ID] => 1851
            [post_date] => 2021-02-13 18:09:00 
            [post_date_gmt] => 2021-02-13 23:09:00 
        )
)

下一个 foreach 我正在经历它,我想用我从另一个数组获得的值更改 [0]..[1]..[3] 键:

foreach ($most_seen_list as $key => $value) 
    $newResult[$value->ID];

预期输出:

Array ( 
    [12] => WP_Post Object ( 
            [ID] => 1851
            [post_date] => 2021-02-13 18:09:00 
            [post_date_gmt] => 2021-02-13 23:09:00 
            )
    [7] => WP_Post Object ( 
            [ID] => 14341 
            [post_date] => 2021-06-01 17:57:00 
            [post_date_gmt] => 2021-06-01 22:57:00 
        )
    [3] => WP_Post Object ( 
            [ID] => 17834 
            [post_date] => 2021-10-20 16:01:50 
            [post_date_gmt] => 2021-10-20 21:01:50 
        )
)

【问题讨论】:

$newResult[$value->ID]; 实际上并没有任何事情。你的意思是赋值吗?例如$newResult[$value->ID] = $key; 或许... 重新排列结果数组是否重要?如果没有,您可以在 $newResult 和 $views 和 array_combine($views, $newResult) 上使用 ksort 如果您不需要视图本身作为键,而只需要链接到 WP_Post 的数据,您还可以使用 \SplObjectStorage 将每个视图计数附加到对象 $viewInfo = new SplObjectStorage( ); foreach ($most_seen_list as $key => $post) $viewInfo->attach($post, $views[$post->ID] ?? null); ``` 现在你可以使用 $viewInfo[$oneOfThePosts] 来获取视图 对帖子数组进行排序后是否需要知道浏览量?否则,您可以将 usort 与知道 $views 并相应排序的回调一起使用。您使用的 php 版本是什么? 【参考方案1】:

我假设您已经对 $views 数组进行了排序。因此,您需要处理每个 $most_seen_list 对象数组,以使用内部循环找到正确的对象

$views = Array ( 1851 => 12, 14341 => 7, 17834 => 3 );
$most_seen_list = Array ( 
    (Object) [ 'ID' => 17834,'post_date' => '2021-10-20 16:01:50', 'post_date_gmt' => '2021-10-20 21:01:50',
    ],
    (Object) [ 'ID' => 14341, 'post_date' => '2021-06-01 17:57:00', 'post_date_gmt' => '2021-06-01 22:57:00'
    ],
    (Object) ['ID' => 1851, 'post_date' => '2021-02-13 18:09:00', 'post_date_gmt' => '2021-02-13 23:09:00' 
    ]
);

$new = [];
//get the ID'2 in the predefined order set in $views
foreach ( $views as $key=>$val) 
    // for each view find the correct object in $most_seen_list
    foreach( $most_seen_list as $obj) 
        if ( $obj->ID == $key ) 
            $new[$val] = $obj;
            break;  // terminate this iteration
        
    


print_r($new);

结果

Array
(
    [12] => stdClass Object
        (
            [ID] => 1851
            [post_date] => 2021-02-13 18:09:00
            [post_date_gmt] => 2021-02-13 23:09:00
        )

    [7] => stdClass Object
        (
            [ID] => 14341
            [post_date] => 2021-06-01 17:57:00
            [post_date_gmt] => 2021-06-01 22:57:00
        )

    [3] => stdClass Object
        (
            [ID] => 17834
            [post_date] => 2021-10-20 16:01:50
            [post_date_gmt] => 2021-10-20 21:01:50
        )

)

【讨论】:

当有相同浏览量的帖子时仍然会出现问题【参考方案2】:

如果您不需要查看量作为键(如果某些查看量仍然相同,这可能会出现问题),您可以使用以下内容以正确的顺序对帖子进行排序。

// sort asc on views
usort($most_seen_list, function($postA, $postB) use ($views) 
    return $views[$postA->ID] <=> $views[$postB->ID];
);
$most_seen_list = array_reverse($most_seen_list); // reverse the order, so most viewed is first

在此之后,您仍然可以使用以下方法获取每个帖子的浏览量:

$views[$oneOfThePosts->ID];

【讨论】:

以上是关于循环时向数组添加字段和值?的主要内容,如果未能解决你的问题,请参考以下文章

登录时向会话对象添加自定义字段

允许用户在需要输入更多内容时向表单添加更多文本框字段

使用 for loop .splitlines 循环将键和值添加到字典

如何在使用ActionListener按钮和GUI时向数组列表中添加项目?

如何在 C# 运行时向类添加属性?

三种方法实现为数组中的对象添加一个新的属性和值