查看: 2268|回复: 0

[PHP代码] PHP遍历数组的三种方式

发表于 2018-3-12 08:00:03

图片描述

  1. <?php
  2. $people = array("Bill", "Steve", "Mark", "David");
  3. echo current($people) . "<br>"; // 当前元素是 Bill
  4. echo next($people) . "<br>"; // Bill 的下一个元素是 Steve
  5. echo current($people) . "<br>"; // 现在当前元素是 Steve
  6. echo prev($people) . "<br>"; // Steve 的上一个元素是 Bill
  7. echo end($people) . "<br>"; // 最后一个元素是 David
  8. echo prev($people) . "<br>"; // David 之前的元素是 Mark
  9. echo current($people) . "<br>"; // 目前的当前元素是 Mark
  10. echo reset($people) . "<br>"; // 把内部指针移动到数组的首个元素,即 Bill
  11. echo next($people) . "<br>"; // Bill 的下一个元素是 Steve
  12. print_r (each($people)); // 返回当前元素的键名和键值(目前是 Steve),并向前移动内部指针
  13. ?>
复制代码

然后是SPL标准库的一些测试

  1. <?php
  2. //迭代器
  3. $fruits = [
  4. "apple" => 'apple value', //position = 0
  5. "orange" => 'orange value', //position = 1
  6. "grape" => 'grape value',
  7. "plum" => 'plum value',
  8. ];
  9. echo "**** use fruits directly *******\n";
  10. foreach ($fruits as $key => $value) {
  11. echo $key . ":" .$value. "\n";
  12. }
  13. //我们经常用的foreach的原理是下面的这部分。
  14. echo "**** use ArrayIterator in for *******\n";
  15. // 使用ArrayIterator遍历数组, 先把数组包装成一个ArrayObject,然后去生成迭代器
  16. $obj = new ArrayObject($fruits);
  17. $it = $obj->getIterator();
  18. foreach ($it as $key => $value) {
  19. echo $key . ":" .$value. "\n";
  20. }
  21. echo "**** use ArrayIterator in while *******\n";
  22. $it->rewind(); //别忘了rewind
  23. while($it->valid()) {
  24. echo $it->key() . ":" .$it->current(). "\n";
  25. $it->next();
  26. }
  27. echo "**** use ArrayIterator jump someone *******\n\n";
  28. //跳过某些元素进行打印
  29. $it->rewind();
  30. if($it->valid()){
  31. $it->seek(2); //找到position = 2的节点,跳过之前的,调用seek方法,要先调用valid
  32. while($it->valid()) {
  33. echo $it->key() . ":" .$it->current(). "\n";
  34. $it->next();
  35. }
  36. }
  37. echo "**** use ArrayIterator sort *******\n\n";
  38. $it->ksort(); //根据key排序
  39. foreach ($it as $key => $value) {
  40. echo $key . ":" .$value. "\n";
  41. }
  42. echo "**** use ArrayIterator sort *******\n\n";
  43. $it->asort(); //根据value排序
  44. foreach ($it as $key => $value) {
  45. echo $key . ":" .$value. "\n";
  46. }
  47. ?>
复制代码
  1. <?php
  2. //双向链表
  3. $obj = new SplDoublyLinkedList();
  4. $obj->push(1); //把新的节点数据添加到数据链表的顶部(Top)
  5. $obj->push(2);
  6. $obj->push(3);
  7. $obj->unshift(10);//把新的节点数据添加到数据链表的底部(Bottom)
  8. print_r($obj);
  9. $obj->rewind(); //rewind用于把节点指针指向bottom所在节点
  10. echo 'current:'. $obj->current()."\n"; //current获取指针指向的节点
  11. $obj->next();
  12. echo 'next node:'. $obj->current()."\n";
  13. $obj->next();//指针指向下一个节点
  14. $obj->next();
  15. $obj->prev();//指针指向上一个节点
  16. echo 'prev node:'. $obj->current()."\n";
  17. $obj->next();
  18. $obj->next();
  19. echo 'next node:'. $obj->current()."\n";
  20. if($obj->current())
  21. echo "Current node valid\n";
  22. else
  23. echo "Current node invalid\n";
  24. $obj->rewind();
  25. if($obj->valid()) //如果当前节点是有效节点,valid返回true
  26. echo "valid list\n";
  27. else
  28. echo "invalid list\n";
  29. echo "Pop value:". $obj->pop()."\n";
  30. print_r($obj);
  31. echo 'current:'. $obj->current()."\n";
  32. $obj->next();//1
  33. $obj->next();//2(top)
  34. $obj->pop(); //1.把Top位置的节点从链表中删除,并返回。
  35. //如果current正好指向Top位置,那么调用pop之后,current会失效。
  36. echo 'next node:'.$obj->current()."\n";
  37. print_r($obj);
  38. $obj->shift();//把Bottom位置的节点从链表中删除,并返回。
  39. print_r($obj);
复制代码
  1. <?php
  2. $queue = new SplQueue(); //队列
  3. $queue->enqueue('a'); // 插入一个节点到队列里面的Top位置
  4. $queue->enqueue('b');
  5. $queue->enqueue('c');
  6. print_r($queue);
  7. echo "Bottom:" . $queue->bottom() . "\n"; //队列头
  8. echo "Top:" . $queue->top() . "\n"; //队列尾
  9. //队列的offset=0是Bottom所在的位置,offset=1往下找
  10. $queue->offsetSet(0,'A');
  11. print_r($queue);
  12. //双向列表的rewind和堆栈的rewind相反,堆栈的rewind使得当前指针指向Top所在的位置,而双向链表的rewind使得当前指针指向Bottom所在的位置,队列跟双向链表一样。
  13. $queue->rewind();
  14. echo "current: " . $queue->current() . "\n";
  15. while ($queue->valid()) {
  16. echo $queue->key()."=>".$queue->current(). "\n";
  17. $queue->next();
  18. }
  19. //dequeue类似堆栈的pop,提取bottom位置的节点,并返回。同时,删除这个元素
  20. echo "dequeue queue:" . $queue->dequeue() . "\n";
  21. print_r($queue);
  22. ?>
复制代码
  1. <?php
  2. //堆栈
  3. $stack = new SplStack();
  4. //不管是双向链表还是堆栈,rewind都指向最先出来的那个节点。
  5. $stack->push('a'); //向堆栈中放入一个元素到Top位置
  6. $stack->push('b');
  7. $stack->push('c');
  8. echo "Bottom:" . $stack->bottom() . "\n"; //栈底
  9. echo "Top:" . $stack->top() . "\n"; //栈顶
  10. //堆栈的offset=0是Top所在的位置,offset=1往上找
  11. $stack->offsetSet(0,'C');
  12. print_r($stack);
  13. //双向列表的rewind和堆栈的rewind相反,堆栈的rewind使得当前指针指向Top所在的位置,而双向链表的rewind使得当前指针指向Bottom所在的位置。
  14. $stack->rewind();
  15. echo "current:" . $stack->current() . "\n";
  16. //堆栈的next往下走(往Bottom方向)
  17. $stack->next();
  18. echo "next:" . $stack->current() . "\n";
  19. // 遍历堆栈,先入后出
  20. $stack->rewind();
  21. while ($stack->valid()) {
  22. echo $stack->key()."=>" . $stack->current()."\n";
  23. $stack->next(); //next操作不会从链表中删除元素
  24. }
  25. // 删除堆栈数据
  26. $popObj = $stack->pop(); //pop操作从堆栈中提取出最后一个元素(Top位置),同时从堆栈中删除该节点
  27. echo "Poped object: " . $popObj . "\n";
  28. print_r($stack);
  29. $a = false || true;
  30. $b = false or true;
  31. ?>
复制代码


回复

使用道具 举报