0

我目前正在清理一些讨厌的代码。这段代码非常深入地为现有数组定义了几个新键:

$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);
  • 我是否可以始终依靠我喜欢的方法来获得与现有案例相同的结果?
  • 我喜欢的方法会被认为是不清楚和毫无意义的吗?

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

相关 PHP 文档

+ 运算符返回附加到左侧数组的右侧数组;对于两个数组中都存在的键,将使用左侧数组中的元素,而忽略右侧数组中的匹配元素。

笔记:

在我的情况下,接受的答案对我有所帮助。这个问题不一定有一个正确的答案,但可能会启发其他人,就像我一样。

4

3 回答 3

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

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

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

于 2013-06-13T10:19:15.333 回答
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);
于 2013-06-13T10:05:24.920 回答
1

每个人都有不同的品味,而语言(PHP、Python等)一般允许你以各种方式做同样的事情,服务于所有品味和风格的代码......


声明的with想法

@MaximKumpan 的回答就像使用Python 和其他语言 的with..as语句一样。想象一下这样的事情,

   //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 的代码。

一般配置问题/解决方案

你的问题让我想起了我们之前在各种配置脚本中看到的东西。这里我们有一个典型的 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!

但是,您的问题不是合并通用数组,而是关于“合并关联数组” ......您也可以这样做(!),请参阅其他类似的问题/答案 (另请参阅array_merge_recursive 函数)。

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

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

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

于 2013-06-13T11:10:53.723 回答