我正在关注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)
。那里发生了什么?
据我了解,$data
和array_flip($data_keys)
的密钥完全相同。虽然array_flip($data_keys)
的值为0,1,2,3,4,...
,但为什么呢? $column_formats
不会覆盖这些值吗?
答案 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
但就像我说的那样,如果不知道这些数据是什么,就无法知道他们的意图是什么。我只是"假设"在这里(说明我的观点)