为什么我';在下面的场景中,我从另一个数组中得到了一个奇怪的数组


Why I'm getting weird array from another array in following scenario?

我有一个名为$request_data的数组,如下所示:

Array
(
    [link] => http://www.yahoo.co.in
    [is_activity_feed] => 1
    [status_info] => my new yahoo link post
)

然后,我在上面的数组的基础上创建了一个名为$aVals的新数组,如下所示:

$aVals['is_activity_feed']      = $request_data['is_activity_feed'];
$aVals['link']['description']   = $request_data['link']['description'];
$aVals['link']['image']         = $request_data['link']['default_image'];
$aVals['link']['title']         = $request_data['link']['title'];
$aVals['link']['url']           = $request_data['link']['link'];
$aVals['status_info']           = $request_data['status_info'];
$aVals["parent_user_id"]        = $request_data['group_id'];
$aVals["callback_item_id"]      = $request_data['group_id'];
$aVals["callback_module"]       = $request_data['callback_module'];
$aVals["group_id"]              = $request_data['group_id'];

现在,在执行语句print_r($aVals);时,我得到以下奇怪的数组:

Array
(
    [is_activity_feed] => 1
    [link] => Array
        (
            [description] => h
            [image] => h
            [title] => h
            [url] => h
        )
    [status_info] => my new yahoo link post
    [parent_user_id] => 
    [callback_item_id] => 
    [callback_module] => 
    [group_id] => 
)

从上面的输出中,我不明白为什么下面的数组带有h值,即使数组$request_data中没有相应的数组键**(描述、标题、图像、url)**。

理想情况下,在下面的[link]数组中,所有密钥都应该包含null值:

[link] => Array
(
    [description] => h
    [image] => h
    [title] => h
    [url] => h
)

请向我解释这个'h'字母是从哪里来的以及如何来的,并将其设置为上面内部数组中每个键的值。这将对我有很大帮助。

请在这方面指导我。我哪里错了?我需要对代码进行哪些更改?

谢谢。等待您宝贵的答复。

密钥description$request_data['link']中不存在。它的求值结果为0,因此它基本上是说$request_data['link'][0]

你应该看到一个警告(如果你有错误显示):

Warning: Illegal string offset 'description' in - on line X

它将值设置为h,因为这是值http://www.yahoo.co.in的第一个字母(或字符0)。

有效$request_data['link'][0] == substr($request_data['link'],0,1)


在尝试访问之前,请尝试检查密钥是否已设置:

if (isset($request_data['link']['description'])) {
    $aVals['link']['description'] = $request_data['link']['description'];
} else {
    $aVals['link']['description'] = null;
}

如果你知道你的数组可以取什么可能的值(当构建$aVals时,你似乎知道索引),我会这样做,将数组初始化为一些期望的值(基于你的示例键):

$request_data = array_fill_keys(array('link', 'is_activity_feed', 'status_info', 'status_info', 'group_id', 'callback_module'), null);
$request_data['link'] = array();
$request_data['link'] = array_fill_keys(array('description', 'default_image', 'title', 'link'), null);

因此,当您访问任何密钥时,您之前就知道它已初始化为null,并在稍后填充(或不填充)。

理想情况下,根据您的用例,我甚至会创建一个对象,这样更容易处理更复杂的情况,但这完全取决于您的使用情况。