1. PHP_FUNCTION(array_combine)
  2. {
  3. HashTable *values, *keys;
  4. uint32_t pos_values = ;
  5. zval *entry_keys, *entry_values;
  6. int num_keys, num_values;
  7.  
  8. // 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
  9. if (zend_parse_parameters(ZEND_NUM_ARGS(), "hh", &keys, &values) == FAILURE) {
  10. return;
  11. }
  12.  
  13. // 第一个数组的元素个数
  14. num_keys = zend_hash_num_elements(keys);
  15. // 第二个数组的元素个数
  16. num_values = zend_hash_num_elements(values);
  17.  
  18. // 两个数组的元素个数必须一致
  19. if (num_keys != num_values) {
  20. php_error_docref(NULL, E_WARNING, "Both parameters should have an equal number of elements");
  21. RETURN_FALSE;
  22. }
  23.  
  24. // 初始化返回值(数组)
  25. array_init_size(return_value, num_keys);
  26.  
  27. // 空数组,函数中止
  28. if (!num_keys) {
  29. return;
  30. }
  31. // 循环遍历第一个数组
  32. ZEND_HASH_FOREACH_VAL(keys, entry_keys) {
  33. /* 通过pos_value从前向后取第一个数组和第二个数组的元素值,直到数组尾
  34. * 每次取出元素后组成键值对,插入返回数组。
  35. */
  36. while () {
  37. if (pos_values >= values->nNumUsed) {
  38. break;
  39. } else if (Z_TYPE(values->arData[pos_values].val) != IS_UNDEF) {
  40. entry_values = &values->arData[pos_values].val;
  41. if (Z_TYPE_P(entry_keys) == IS_LONG) {
  42. entry_values = zend_hash_index_update(Z_ARRVAL_P(return_value),
  43. Z_LVAL_P(entry_keys), entry_values);
  44. } else {
  45. zend_string *key = zval_get_string(entry_keys);
  46. entry_values = zend_symtable_update(Z_ARRVAL_P(return_value),
  47. key, entry_values);
  48. zend_string_release(key);
  49. }
  50. zval_add_ref(entry_values);
  51. pos_values++;
  52. break;
  53. }
  54. pos_values++;
  55. }
  56. } ZEND_HASH_FOREACH_END();
  57. }

php内置函数分析之array_combine()的更多相关文章

  1. map内置函数分析所得到的思路

    map:会根据提供的函数对指定序列做映射. map(func, *iterables) --> map object Make an iterator that computes the fun ...

  2. php内置函数分析之array_diff_assoc()

    static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_type) /* {{{ */ { uint ...

  3. php内置函数分析之ucwords()

    PHP_FUNCTION(ucwords) { zend_string *str; char *delims = " \t\r\n\f\v"; register char *r, ...

  4. php内置函数分析之strtoupper()、strtolower()

    strtoupper(): PHP_FUNCTION(strtoupper) { zend_string *str; ZEND_PARSE_PARAMETERS_START(, ) Z_PARAM_S ...

  5. php内置函数分析之ucfirst()、lcfirst()

    ucfirst($str) 将 str 的首字符(如果首字符是字母)转换为大写字母,并返回这个字符串. 源码位于 ext/standard/string.c /* {{{ php_ucfirst Up ...

  6. php内置函数分析之trim()

    官方手册中: 类似函数还有两个:ltrim() 和 rtrim().分别处理字符串的左侧.右侧. trim()的具体实现位于:ext/standard/string.c /* {{{ proto st ...

  7. php内置函数分析之str_pad()

    PHP_FUNCTION(str_pad) { /* Input arguments */ zend_string *input; /* Input string 输入字符串*/ zend_long ...

  8. php内置函数分析之array_fill_keys()

    PHP_FUNCTION(array_fill_keys) { zval *keys, *val, *entry; if (zend_parse_parameters(ZEND_NUM_ARGS(), ...

  9. php内置函数分析range()

    PHP_FUNCTION(range) { zval *zlow, *zhigh, *zstep = NULL, tmp; , is_step_double = ; double step = 1.0 ...

随机推荐

  1. Mybaits查询返回值是List类型的

    查询返回值是list类型的 1 首先在接口中写方法 public interface EmployeeMapper { public List<Employee> getEmpsByLas ...

  2. C# CLR20R3 程序终止的几种解决方案 【转】

    [转]CLR20R3 程序终止的几种解决方案   这是因为.NET Framework 1.0 和 1.1 这两个版本对许多未处理异常(例如,线程池线程中的未处理异常)提供支撑,而 Framework ...

  3. Python 笔试集(3):编译/解释?动态/静态?强/弱?Python 是一门怎样的语言

    面试题 解释/编译?动态/静态?强/弱?Python 到底是一门怎样的语言? 编译 or 解释? 编译.解释都是指将(与人类亲和的)编程语言翻译成(计算机能够理解的)机器语言(Machine code ...

  4. 阶段3 1.Mybatis_09.Mybatis的多表操作_5 完成user的一对多查询操作

    定义List<Account> accounts,生成getter和setter 复制AccountTest类改名UserTest类 修改测试类 还没封装所以Account的list都是n ...

  5. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_6 mybatis中的事务原理和自动提交设置

    在实际的开发中,建议使用连接池的形式. JNDI的资料 H:\BaiDu\黑马传智JavaEE57期 2019最新基础+就业+在职加薪\讲义+笔记+资料\主流框架\31.会员版(2.0)-就业课(2. ...

  6. LoadRunner11安装及破解

    一.LoadRunner11安装 以管理员身份运行setup.exe 选择第一个LoadRunner完整安装程序 按照界面会弹出以上提示框,直接选择否 检查系统缺少哪些组件,点击“确定”自动安装 点击 ...

  7. C++:利用如下公式,编写函数计算∏的值,直到最后一项的绝对值小于e,主程序接收从键盘输入的e,输出∏的值(保留5位小数)。 ∏/4 = 1-1/3+1/5-1/7...

    利用如下公式,编写函数计算∏的值,直到最后一项的绝对值小于e,主程序接收从键盘输入的e,输出∏的值(保留5位小数). ∏/4 = 1-1/3+1/5-1/7... #include <iostr ...

  8. docker安装tomcat&部署javaweb程序

    一.docker定制简单的java-web应用镜像 网址: 1.jdk下载网址:https://www.oracle.com/technetwork/java/javase/downloads/jdk ...

  9. [JS] 鼠标点击文本框清空默认值,离开文本框恢复默认值

    在使用文本框的时候,若设定了初始值,选择文本框进行输入的时候要将本来的内容进行删除,会显得非常麻烦 可以在文本框属性定义触发onfocus和onblur两个事件时对应的js功能 下面以asp.net代 ...

  10. python 开启进程两种方法 multiprocessing模块 介绍

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu\_count\(\)查看),在python中大部分情况需要使用多进 ...