多数大学生出来选择的工作和专业无关
首页 > 专业知识

快速掌握PHP数组循环取数据技巧

时间:2018-12-11 20:45:21 [来源]:郑州PHP培训学校

   快速掌握PHP数组循环取数据技巧

  随着时代的发展,关注PHP的人越来越多,文章这里就PHP数组循环的到数据进行详细的介绍,希望对大家有帮助。
  我们想要得到大堆数据,你就要对数组进行循环,我们现在就来看看PHP数组循环得到数据。因要负责将数据放置在数组内,现在,如何将其取出呢? 从数组中检索数据非常简单:所有你所需要做的就是使用索引号来访问数组的适当元素。为了读取整个数组的内容,你只需要使用你在该教程第三章中所学到的循环结构来简单的对其进行循环操作即可。
  来一个快捷的例子如何?
  <html> <head></head> <body> My favourite bands are: <ul> <?php// define array $artists = array('Metallica', 'Evanescence', 'Linkin Park', 'Guns n Roses');// loop over it and print array elements for ($x = 0; $x < sizeof($artists); $x++) { echo '<li>'.$artists[$x]; } ?> </ul> </body> </html>
  当你运行该脚本时,你会看到下面的结果:
  My favourite bands are: Metallica Evanescence Linkin Park Guns n Roses在这个实例中,我首先定义了一个数组,然后使用for()循环做下面的工作:遍历该数组,使用索引符号取得元素,然后一个接一个的显示它们。 在这里,我将吸引你们的注意力在sizeof()函数上。该函数是最重要也是最常用的数组函数之一。其返回数组的大小(读取:数组内元素的个数)。它大部分用于循环计数器中以确保循环次数和数组中的所有元素的个数一致。 如果你正在使用联合数组,那么随手可得array_keys()和array_values()函数以用来得到数组中所有关键字和对应的值的列表。
  <?php // define an array $menu = array('breakfast' => 'bacon and eggs', 'lunch' => 'roast beef', 'dinner' => 'lasagna');/* returns the array ('breakfast', 'lunch', 'dinner') with numeric indices */ $result = array_keys($menu); print_r($result);print "<br />"; /* returns the array ('bacon and eggs', 'roast beef', 'lasagna') with numeric indices */ $result = array_values($menu);print_r($result); ?>
  然而,这里还有一种更简单的方法来提取数组中的所有元素。PHP4.0介绍了一种经设计专门用于对数组反复枚举目的的非常新的循环类型:foreach()循环(它的语法结构类似于同名的Perl结构)。
  下面是其语法格式:
  foreach ($array as $temp) { do this! }
  foreach()循环对作为参数传递给它的数组的每一个元素运行一次,在每次重复时向前遍历该数组。和for()循环不同,它不需要计数器或调用函数 sizeof(),因为它自动跟踪其在数组中的位置。在每次运行的时候,执行大括号内的语句,同时,当前选择的数组元素可以通过一个临时的PHP数组循环变量来访问。
  为了更好的理解它是如何工作的,考虑使用foreach()循环对之前的例子进行重新改写:
  <html> <head></head> <body> My favourite bands are: <ul> <?php // define array $artists = array('Metallica', 'Evanescence', 'Linkin Park', 'Guns n Roses'); // loop over it // print array elements foreach ($artists as $a){ echo '<li>'.$a; } ?> </ul> </body> </html>
  每次执行循环时,它将当前选择的数组元素的值放在临时变量$a中。之后,该变量可以被PHP数组循环块中的语句进行使用。因为foreach()循环不需要计数器跟踪其在数组中的位置,所以它需要更少的维护且同时比标准的for()循环更加易读。奥,是的…,它同样也可与关联数组一起起作用,而不需要额外的编程。
 
  详细介绍对象PHP串行化
  当一个对象被PHP串行化,PHP会调用__sleep方法(如果存在的话). 在反串行化一个对象后,PHP 会调用__wakeup方法。
  我们大家有知道PHP串行化可以把变量包括对象,转化成连续bytes数据,你可以将串行化后的变量存在一个文件里或在网络上传输,然后再反串行化还原为原来的数据。文章这里就PHP串行化为大家详细的介绍。你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法. 有时你可能需要一个对象在反串行化后立即执行。为了这样的目的,PHP会自动寻找__sleep和__wakeup方法。
  当一个对象被PHP串行化,PHP会调用__sleep方法(如果存在的话). 在反串行化一个对象后,PHP 会调用__wakeup方法. 这两个方法都不接受参数. __sleep方法必须返回一个数组,包含需要串行化的属性. PHP会抛弃其它属性的值。如果没有__sleep方法,PHP将保存所有属性。例子1显示了如何用__sleep和__wakeup 方法来串行化一个对象. Id属性是一个不打算保留在对象中的临时属性. __sleep方法保证在串行化的对象中不包含id属性. 当反串行化一个User对象,__wakeup方法建立id属性的新值. 这个例子被设计成自我保持. 在实际开发中,你可能发现包含资源(如图像或数据流)的对象需要这些方法。
  Listing1 Object serialization
  class User
  {
  public $name;
  public $id;
  function __construct()
  {
  //give user a unique ID 赋予一个不同的ID
  $this->id = uniqid();
  }
  function __sleep()
  {
  //do not serialize this->id 不串行化id
  return(array("name"));
  }
  function __wakeup()
  {
  //give user a unique ID
  $this->id = uniqid();
  }
  }
  //create object 建立一个对象
  $u = new User;
  $u->name = "Leon";
  //serialize it 串行化 注意不串行化id属性,id的值被抛弃$s = serialize($u);
  //unserialize it 反串行化 id被重新赋值
  $u2 = unserialize($s);
  //$u and $u2 have different IDs $u和$u2有不同的IDprint_r($u);
  print_r($u2);
  ?>
 
  常见PHP数据库解决方案
  文章这里揭秘了常见PHP数据库问题的解决方案,直接使用 MySQL、不使用自动增量功能,希望对大家有帮助。
  我们在使用PHP连接数据库的时候会遇到很多问题,文章这里揭露 PHP 应用程序中出现的常见数据库问题 —— 包括数据库模式设计、数据库访问和使用数据库的业务逻辑代码 —— 以及它们的解决方案。如果只有一种 方式使用数据库是正确的。您可以用很多的方式创建PHP数据库设计、数据库访问和基于数据库的 PHP 业务逻辑代码,但最终一般以错误告终。本文说明了数据库设计和访问数据库的 PHP 代码中出现的五个常见问题,以及在遇到这些问题时如何修复它们。
  PHP数据库问题 1:直接使用 MySQL
  一个常见问题是较老的 PHP 代码直接使用 mysql_ 函数来访问数据库。清单 1 展示了如何直接访问数据库。
  清单 1. Access/get.php
  <?php
  function get_user_id( $name )
  {
  $db = mysql_connect( 'localhost', 'root', 'password' );mysql_select_db( 'users' );
  $res = mysql_query( "SELECT id FROM users WHERE login='".$name."'" );while( $row = mysql_fetch_array( $res ) ) { $id = $row[0]; }
  return $id;
  }
  var_dump( get_user_id( 'jack' ) );
  ?>
  注意使用了 mysql_connect 函数来访问数据库。还要注意查询,其中使用字符串连接来向查询添加 $name 参数。该技术有两个很好的替代方案:PEAR DB 模块和 PHP Data Objects (PDO) 类。两者都从特定数据库选择提供抽象。因此,您的代码无需太多调整就可以在 IBM? DB2?、MySQL、PostgreSQL 或者您想要连接到的任何其他数据库上运行。使用 PEAR DB 模块和 PDO 抽象层的另一个价值在于您可以在 SQL 语句中使用 ? 操作符。这样做可使 SQL 更加易于维护,且可使您的应用程序免受 SQL 注入攻击。
  清单 2. Access/get_good.php
  <?php
  require_once("DB.php");
  function get_user_id( $name )
  {
  $dsn = 'mysql://root:password@localhost/users';$db =& DB::Connect( $dsn, array() );
  if (PEAR::isError($db)) { die($db->getMessage()); }
  $res = $db->query( 'SELECT id FROM users WHERE login=?',array( $name ) );$id = null;
  while( $res->fetchInto( $row ) ) { $id = $row[0]; }
  return $id;
  }
  var_dump( get_user_id( 'jack' ) );
  ?>
  注意,所有直接用到 MySQL 的地方都消除了,只有 $dsn 中的数据库连接字符串除外。此外,我们通过 ? 操作符在 SQL 中使用 $name 变量。然后,查询的数据通过 query() 方法末尾的 array 被发送进来。
  PHP数据库问题 2:不使用自动增量功能
  与大多数现代数据库一样,MySQL 能够在每记录的基础上创建自动增量惟一标识符。除此之外,我们仍然会看到这样的代码,即首先运行一个 SELECT 语句来找到最大的 id,然后将该 id 增 1,并找到一个新记录。清单 3 展示了一个示例坏模式。
  清单 3. Badid.sql
  DROP TABLE IF EXISTS users;
  CREATE TABLE users (
  id MEDIUMINT,
  login TEXT,
  password TEXT
  );
  INSERT INTO users VALUES ( 1, 'jack', 'pass' );INSERT INTO users VALUES ( 2, 'joan', 'pass' );INSERT INTO users VALUES ( 1, 'jane', 'pass' );这里的 id 字段被简单地指定为整数。所以,尽管它应该是惟一的,我们还是可以添加任何值,如 CREATE 语句后面的几个 INSERT 语句中所示。清单 4 展示了将用户添加到这种类型的模式的 PHP 代码。
 

上一篇:PHP命名空间规则解析及高级功能

下一篇:PHP程序员的技术成长规划