我浏览了array_keys和array_values的手册页。他们都没有说过他们是否尊重原始阵列的元素顺序。他们承诺的是他们将返回原始数组中的所有键或值。但是,我们能够绝对确定元素的顺序也与原始数组的顺序完全相同吗?不管它是什么阵列?
我问这是因为我有这个:
$record = array('name' => 'Lisa', 'age' => 16, 'gender' => 'female');
$fields = array_keys($record);
$values = array_values($record);
$sql = "INSERT INTO {$this -> table} (".implode(', ', $fields).") VALUES (".implode(', ', array_fill(0, count($fields), '?')).")";
$sth = $this -> dbh -> prepare($sql);
$sth -> execute($values);
虽然我可以使用命名参数,但它会花费更多的编码,所以我更喜欢这种方式,它需要$ fields和$ values的元素在相应的对中,最好它们与原始数组的顺序完全相同$记录。
有什么想法吗?
答案 0 :(得分:8)
是的,他们是。实际上,手册中没有提到,所以我指的是内部实现。以下是array_keys()
的示例:
/* Go through input array and add keys to the return array */
zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(input), &pos);
while (zend_hash_get_current_data_ex(Z_ARRVAL_P(input), (void **)&entry, &pos) == SUCCESS) {
if (search_value != NULL) {
is_equal_func(&res, search_value, *entry TSRMLS_CC);
add_key = zval_is_true(&res);
}
if (add_key) {
MAKE_STD_ZVAL(new_val);
zend_hash_get_current_key_zval_ex(Z_ARRVAL_P(input), new_val, &pos);
zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &new_val, sizeof(zval *), NULL);
}
zend_hash_move_forward_ex(Z_ARRVAL_P(input), &pos);
}
- 是的,是的,上面的代码在C中,但它肯定显示了函数内部的内部逻辑。我认为lxr
对于搜索非常友好 - 所以我省略了诸如宏定义之类的东西(他们不在这个问题上) - 但你可以更深入地研究全貌。