PHP / Wordpress:帮助我理解为什么本教程的作者使用array_keys()后跟array_flip()

时间:2018-03-11 23:20:55

标签: php wordpress

我正在关注this tutorial,但一直在努力理解insert_row()方法中的一个步骤。这是完整的方法:

// Adds new row to table
public function insert_row($data, $type='') {
    global $wpdb;

    // set defaults
    $data = wp_parse_args( $data, $this->get_column_defaults());

    do_action('add_pre_insert_' . $type, $data);

    // initialise column format array
    $column_formats = $this->get_columns();

    // force fields to lower case
    $data = array_change_key_case($data);

    // remove unknown columns
    $data = array_intersect_key($data, $column_formats);

    // reorder $column_formats to match the order of columns in $data
    $data_keys = array_keys($data);
    $column_formats = array_merge(array_flip($data_keys), $column_formats);

    $wpdb->insert($this->table_name, $data, $column_formats);

    do_action('add_post_insert_'.$type, $wpdb->insert_id, $data);

    return $wpdb->insert_id;
}

我无法理解为什么作者会将array_keys($data)分配给$data_keys,然后在下一行调用array_flip($data_keys)。那里发生了什么?

据我了解,$dataarray_flip($data_keys)的密钥完全相同。虽然array_flip($data_keys)的值为0,1,2,3,4,...,但为什么呢? $column_formats不会覆盖这些值吗?

1 个答案:

答案 0 :(得分:0)

好的,

所以array_keys获取数组的键,所以如果你有这个数组

['one'=>'foo', 'two'=>'bar']

你可以从数组键中得到这个:

[ 0 => 'one', 1=>'two']

现在如果你翻转那就得到了

['one' => 0, 'two' => 1]

至于为什么,我不知道。我需要深入研究代码,我需要一些在这里使用的实际数据。

您可以使用这段代码进行测试(仅供参考,我在头脑中做了第一次):

$a=['one'=>'foo', 'two'=>'bar'];
var_export($a);
$a = array_keys($a);
var_export($a);
$a = array_flip($a);
var_export($a);

输出:

array (
  'one' => 'foo',
  'two' => 'bar',
)array (
  0 => 'one',
  1 => 'two',
)array (
  'one' => 0,
  'two' => 1,
)

您可以对其进行测试here

在任何密钥中添加array_merge后,将替换现有密钥。现在,如果只是从概念角度来看,假设你不想在那里输入密钥,那么我会使用array_fill_keys代替array_flip

$a=['one'=>'foo', 'two'=>'bar'];
var_export($a);
$a = array_keys($a);
var_export($a);
$a = array_fill_keys($a, '');
var_export($a);

输出

array (
  'one' => 'foo',
  'two' => 'bar',
)array (
  0 => 'one',
  1 => 'two',
)array (
  'one' => '',
  'two' => '',
)

正如您所看到的,最后一个数组只有一个空值字符串,如果项目缺失,则前一个方法将数字作为剩余值。这样你就会得到一个空字符串作为左边的值。

here

但就像我说的那样,如果不知道这些数据是什么,就无法知道他们的意图是什么。我只是"假设"在这里(说明我的观点)