为什么我在以下场景中从另一个阵列获得奇怪的数组?

时间:2015-03-05 05:43:39

标签: php arrays associative-array key-value

我有一个标题为$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

理想情况下,在[link]数组下面,所有键都应包含null个值:

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

请向我解释这个'h'字母的来源和方式,并将其设置为上方内部数组中每个键的值。这对我有很大的帮助。

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

感谢。等待你的宝贵回复。

2 个答案:

答案 0 :(得分:0)

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;
}

答案 1 :(得分:0)

如果您知道阵列可以采用哪些值(构建 $ 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并稍后填充(或未填充)。

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