/** * 加入dht网络 * @return void */ function join_dht() { global $table, $bootstrap_nodes; //write(date('Y-m-d H:i:s', time()) . " join_dht\n"); // 循环操作 foreach ($bootstrap_nodes as $node) { // 将node域名解析为IP地址, 并发送find_node请求 find_node(array(gethostbyname($node[0]), $node[1])); } }
*/ function &find_node($key, &$node) { //xdebug_debug_zval('node'); $item =& $node[$key]; //这里的&不能省略,原因如下: /*这里如果省去&,$item和$node[$key]虽然指向同一个zval,但是return的时候会有问题,因为php引用赋值的一个特点,如下。 $a = 1; $b = $a; $c = &$b; 这里第三步的时候,会复制一个zval(int 1),$c和$b指向他,而$a还是指向最开始的那个zval。 好了,当return $item; $item = &find_node()的时候,由于$item不是一个引用,便会复制一个zval,函数中的item和全局变量item都指向他,但是函数结束后,function中的symbol全部被unset,这时刚才创建的zval便只剩下一个引用refcount=1,所以他的is_ref会被设为0。 */ //xdebug_debug_zval('node'); //xdebug_debug_zval('item'); return $item; } $tree = array('one', 'two', 'three', 'four'); $item =& find_node(3, $tree); //xdebug_debug_zval('item'); //xdebug_debug_zval('tree'); $item = 'new value'; var_dump($tree[3]); /* 函数返回引用的时候,必须在定义和使用的时候都加上&,这点和参数传入引用不同 */ function &func() { static $static = 0; $static++; return $static; } $var1 =& func(); //xdebug_debug_zval('var1');
/** * 加入dht网络 * @return void */ function join_dht() { global $table, $bootstrap_nodes; // 循环操作 foreach ($bootstrap_nodes as $node) { // 将node域名解析为IP地址, 并发送find_node请求 find_node(array(gethostbyname($node[0]), $node[1])); } }
<?php function read_xml($skip_white) { $xml = file_get_contents(__DIR__ . "/skipwhite.xml"); $parser = xml_parser_create(); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, $skip_white); xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); $array = array(); $index = array(); xml_parse_into_struct($parser, $xml, $array, $index); return $array; } function find_node($array, $node) { foreach ($array as $key => $val) { if ($val["tag"] == $node) { return $val; } } return array(); } // WITH XML_OPTION_SKIP_WHITE=0 WORKS FINE $array = read_xml(0); $node = find_node($array, "query"); print_r($node); // WITH XML_OPTION_SKIP_WHITE=1 FAILS $array = read_xml(1); $node = find_node($array, "query"); print_r($node);
function &find_node(&$node, $nodeid) { if ($node['id'] == $nodeid) { return $node; } if (isset($node['left'])) { $res =& find_node($node['left'], $nodeid); if (!is_array($res)) { $res =& find_node($node['right'], $nodeid); } return $res; } return $nodeid; }