Heim >Backend-Entwicklung >PHP-Tutorial >php中foreach和for到底有没有区别,尤其是在处理多线程(本例是对IOS进行推送)方面?

php中foreach和for到底有没有区别,尤其是在处理多线程(本例是对IOS进行推送)方面?

WBOY
WBOYOriginal
2016-06-23 14:01:431058Durchsuche

遇到一个困难,解决了好长时间,最后发现是用for 不好使,用foreach好使。

<?php // 循环有问题require_once "/home/bae/app/include/db.php"; $db_obj = new DB();$sql = "select appleID from appleDevice ";$result = $db_obj->db_array($sql);print_r("the array is:".$result);var_dump($result); $countArray = count($result);  print_r("number:".$countArray);	$passphrase = 'zhaojian';	$message = 'My first push notification!';	 	$ctx = stream_context_create();	stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');	stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);	 	// Open a connection to the APNS server	$fp = stream_socket_client(	    'ssl://gateway.sandbox.push.apple.com:2195', $err,	    $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);	 	if (!$fp)	    exit("Failed to connect: $err $errstr" . PHP_EOL);	 	echo 'Connected to APNS' . PHP_EOL;	// Create the payload body	$body['aps'] = array(	    'alert' => $message,	    'sound' => 'default'	    );	 	// Encode the payload as JSON	$payload = json_encode($body);  	//$result = array("2d4401e324e7bd0ce574508b0849c7584b965df4ab183c82b3da65855835ec27","e20f2879b0ff6b7c6554b44f339c9e4bade2ee4a5a3a6d5de77bda074269221f");		foreach ($result as $device) {	$deviceToken = $device['appleID'];	 	print_r("the ".$i." item :".$deviceToken);	$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;	$result = fwrite($fp, $msg, strlen($msg));	if (!$result)	    echo 'Message not delivered' . PHP_EOL;	else	    echo 'Message successfully delivered' . PHP_EOL;} 	 	 	fclose($fp);   ?>

这段代码是针对php对IOS推送的代码。
用foreach那里,如果改成for i=0 i


回复讨论(解决方案)

没有看到你的 for 循环的写法
但你的 foreach 中有
foreach ( $result as $device) {
   $result = fwrite($fp, $msg, strlen($msg));
改变了原始量
如果 for 循环也是这样的话,自然就不行了

foreach 是对数组的引用进行循环的

没有看到你的 for 循环的写法
但你的 foreach 中有
foreach ( $result as $device) {
   $result = fwrite($fp, $msg, strlen($msg));
改变了原始量
如果 for 循环也是这样的话,自然就不行了

foreach 是对数组的引用进行循环的


我用for是这样写的

for($i = 0; $i < $countArray; $i++){	$deviceToken = $result[$i]['appleID'];    print_r("***".$deviceToken."**");    // Build the binary notification	$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;// Send it to the server$result = fwrite($fp, $msg, strlen($msg)); if (!$result)    echo 'Message not delivered' . PHP_EOL;else    echo 'Message successfully delivered' . PHP_EOL; }

这只是往服务器上传数据吧?涉及到修改值了吗?

for($i = 0; $i  {
     $deviceToken = $result[$i]['appleID']; //从数组 $result 中取值
    print_r("***".$deviceToken."**");
    // Build the binary notification
    $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg)); //改变了 $result 的值
  
if (!$result)
    echo 'Message not delivered' . PHP_EOL;
else
    echo 'Message successfully delivered' . PHP_EOL;
}

for($i = 0; $i  {
     $deviceToken = $result[$i]['appleID']; //从数组 $result 中取值
    print_r("***".$deviceToken."**");
    // Build the binary notification
    $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg)); //改变了 $result 的值
  
if (!$result)
    echo 'Message not delivered' . PHP_EOL;
else
    echo 'Message successfully delivered' . PHP_EOL;
}

得君解释,三生有幸!!!豁然开朗,其实把后面的result改个名称用for我试过了还是可以的,,碰巧,重名 了~~~

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn