数组声明的复杂性

时间:2013-06-13 10:01:21

标签: php arrays

我正在清理一些讨厌的代码。这段代码在很大程度上为现有数组定义了几个新键:

$form['long_key_name_right_here_you_see']['title'] = 'Hello';
$form['long_key_name_right_here_you_see']['body'] = 'This be a greeting';
$form['long_key_name_right_here_you_see']['etc'] = 'This does nothing';
$form['another_long_key_name_right']['title'] = 'Hello!';
$form['another_long_key_name_right']['body'] = 'This be a greeting!';
$form['another_long_key_name_right']['etc'] = 'This does nothing.';

我更愿意这样定义:

$arr_form = array('long_key_name_right_here_you_see' => array('title' => 'Hello',
                                                              'body'  => 'This be a greeting',
                                                              'etc'   => 'This does nothing'
),
                  'another_long_key_name_right'      => array('title' => 'Hello!',
                                                              'body'  => 'This be a greeting!',
                                                              'etc'   => 'This does nothing.'));

$form = ($arr_form + $form);
  • 我是否可以依靠我的首选方法来做与现有案例相同的结果?
  • 我的首选方法是否会被视为不明确且毫无意义?

基本上,我只是觉得在行中定义的相同键的巨大墙壁在代码中看起来有点难看,但也许这只是我的想法,这是挑剔的。

Relevant PHP Documentaion

  

+运算符返回附加到左侧的右侧数组   阵列;对于存在于两个数组中的键,来自的数组   将使用左手数组,以及来自的匹配元素   右手阵列将被忽略。

注意:

接受的答案帮助了我我的案例。这个问题不一定有一个真正的答案,但可能会激励他人,就像我一样。

3 个答案:

答案 0 :(得分:2)

由于我们正在使用单个阵列单元,因此我可能会使用指向长键的短指针来提高可读性。就个人而言,我不喜欢过度使用array()函数调用,因为它有点难以阅读。

指针不会占用额外的内存空间作为临时变量。

所以这个:

$form['long_key_name_right_here_you_see']['title'] = 'Hello';
$form['long_key_name_right_here_you_see']['body'] = 'This be a greeting';
$form['long_key_name_right_here_you_see']['etc'] = 'This does nothing';

会变成这样:

$target_form =& $form['long_key_name_right_here_you_see'];

$target_form = array(); // In case it's undefined. Drop this if it's not empty.
$target_form['title'] = 'Hello';
$target_form['body'] = 'This be a greeting';
$target_form['etc'] = 'This does nothing';

unset($target_form); 

请注意,unset语句将取消设置指针引用,而不是数组的内容。如果您决定稍后重用$target_form,则只需要避免覆盖您的数据。

这可能比单纯的评论更值得关注: 指针周围要小心。除非小心使用,否则很容易覆盖数据并难以调试。

答案 1 :(得分:1)

$arr_form += $form;不会给你你想要的输出..你应该反转变量而不是例如:

$form = array();
$arr_form = array(
        'title' => 'Hello',
        'body' => 'This be a greeting',
        'etc' => 'This does nothing'
);
$form['long_key_name_right_here_you_see'] = $arr_form;
var_dump($form);

答案 2 :(得分:1)

每个人都有不同的口味,语言(PHP,Python等)通常允许你做同样的事情 以各种方式,提供各种口味和风格代码......


with陈述想法

@MaximKumpan的答案就是使用with..as statement的Python和其他语言。 想象这样的事情,

   //if not exist, $form['long_key_name_right_here_you_see']=array();    
   with $form['long_key_name_right_here_you_see'] as $f {
     $f['title'] = 'Hello';
     $f['body'] = 'This be a greeting';
     $f['etc'] = 'This does nothing';
   }

注意:只想象(!),真正的PHP代码是$f =& $form['...'],以unset($f)结尾,作为Max的代码。

一般配置问题/解决方案

您的问题让我想起了之前在各种配置脚本中看到的内容。 在这里,我们有一个typical example of Mediawiki,提供两种风格,有两种口味:

$w = array( 'png', 'jpg', 'jp2', 'webp', '...'); // original

$w[] = 'pdf';  // "add one by one item" taste
$w[] = '...';

$new = array( 'pdf', 'ppt', 'jp2' );
$w   = array_merge( $w, $new );  // "add all itens" taste

你还记得另一种方式

$w = $w + $new;
// CAUTION: array_merge, "+" and "+=" are not exactly the same thing!

但是,你的问题不是合并commom数组,它是关于“合并关联数组” ...你也可以这样做(!),see this other similar question/answer (另见array_merge_recursive function)。

对于您的示例,array_merge也是有效且可读的解决方案(在您的代码中替换$arr_form + $form):

 $form = array_merge($form, $arr_form); // not the same as (arr_form,$form)!

Mediawiki(上面的链接)是“最佳做法”的示例,并且(我也)更喜欢array_merge函数而不是数组联合运算符(“+”)。