PHP获取数组中某元素的位置实例

 更新时间:2016年11月25日 17:27  点击:1905
判断数组元素位置我们可以使用array_keys函数与foreach对比来实现,下面小编来给大家介绍介绍具体的实现实例。

array_keys的语法如下:

array_keys(array,value,[strict])

其中strict设置为true将触发数据类型校验的严格匹配模式,默认为false,下边的代码展示了array_keys的一个简单应用。

 代码如下 复制代码


<?php
$test=array(10,20,30,"10","20","30");
print_r(array_keys($test,"10",true));//严格匹配模式
//输出:
//Array ( [0] => 3)
?>

当然我们还可以使用foreach 加判断了

 代码如下 复制代码

$one = array(1, 2, 3, 4);

$two = array("test1" =>array('name'=>"tank","phone"=>12412433),
 "test2"&nbsp; => array('name'=>"ying","phone"=>252523523),
 "test3" => array('name'=>"zhang","phone"=>656452345),);

foreach ($one as $k=>$v) {
 echo "key=".$k."&amp;value=".$v."&lt;br>";
}
$i=0;
foreach ($two as $k=>$v) {

 foreach($v as $value){
  if( $v='tank' )
        {
           echo $i;
         }
          $i++;
 }
}

后面这个是利用遍历数组然后加一值的对比就可以判断出来了。

在php中数组是一种很特殊的数组类型可以存储各种类型的数据,下面我来介绍对数组读取与删除指定数组元素的一些实例。

array:数组

offset: 规定取出元素的开始位置。如果是正数,则从前往后开始取,如果是负值,从后向前取 offset 绝对值。

一、PHP取索引数组的第一个

取索引数组的第一个元素非常容易,下标写0即可,不多解释。


重点和大家分享PHP取关联数组第一个的方法。先放上我今天写的代码:

 

 代码如下 复制代码
//取默认第一个渠道名
$channel_arr = $this->get_from_channel();  //所有渠道数组
$arr_num = count($channel_arr);
$first_channel = array_slice($channel_arr,0,-($arr_num-1));  //取渠道数组第一个
$html['from_channel'] = $first_channel[0];


删除数组

 代码如下 复制代码

 
<?php
$a=array(0=>"Dog",1=>"Cat",2=>"Horse",3=>"Bird");
print_r(array_slice($a,1,2));
?>

输出

Array ( [0] => Cat [1] => Horse )

还有array_shift() 函数删除数组中的第一个元素,并返回被删除元素的值.

相对的array_pop() 函数删除数组中的最后一个元素.

几个函数用下来觉得array_search()比较实用

array_search() 函数与 in_array() 一样,在数组中查找一个键值。如果找到了该值,匹配元素的键名会被返回。如果没找到,则返回 false

 代码如下 复制代码


$array = array('1', '2', '3', '4', '5');

$del_value = 3;
unset($array[array_search($del_value , $array)]);//利用unset删除这个元素

print_r($array);

输出

array('1', '2', '4', '5');

PHP中删除数组中某个元素

在PHP中删除数组元素有以下几种方法:
要删除一个元素,用onset()

 代码如下 复制代码

unset($array[3]);
unset($array['foo']);

要删除多个不连续的元素,也用unset()

 代码如下 复制代码

unset($array[3] $array[5]);
unset($array['foo'] $array['bar']);

要删除多个连续的元素,用array_splice()

 代码如下 复制代码

array_splice($array $offset $length);

前面我讲过简单的数组遍历,这些基于foreach,for之类的语句,下面我来介绍数组的高级遍历方法介绍,各位朋友可参考,这些数组才真用于开发实用性能强,复杂也更高了。

PHP对数组的处理可以称为该语言最有吸引力的特性之一,它支持70多种数组相关的函数。不论你想翻转一个数组、判断某个值在数组中是否存在、将数组转换成一个字符串还是计算数组的大小,仅仅执行一个现有的函数就可以完成。然而也有一些数组相关的任务对开发者的要求就较高,仅仅知道手册有某个功能是不能解决的,这些任务就需要对PHP的原始特性有一些深入的理解,还需要一些解决问题的想象力。

多维关联数组排序
PHP提供了一些数组排序的函数,比如sort(), ksort(),和asort(),但是却没有提供对多维关联数组的排序。


比如这样的数组:

Array
(
  [0] => Array
    (
      [name] => chess
      [price] => 12.99
    )

  [1] => Array
    (
      [name] => checkers
      [price] => 9.99
    )

  [2] => Array
    (
      [name] => backgammon
      [price] => 29.99
    )
)

要将该数组按照升序排序,你需要自己写一个函数用于比较价格,然后将该函数作为回调函数传递给usort()函数来实现该功能:

 代码如下 复制代码

function comparePrice($priceA, $priceB){
    return $priceA['price'] - $priceB['price'];
}

usort($games, 'comparePrice');

执行了该程序片段,数组就会被排序,结果如下所示:

Array
(
  [0] => Array
    (
      [name] => checkers
      [price] => 9.99
    )

  [1] => Array
    (
      [name] => chess
      [price] => 12.99
    )

  [2] => Array
    (
      [name] => backgammon
      [price] => 29.99
    )
)

要将该数组按照降序排序,把comparePrice()函数里面的两个减的数调换位置就可以了。

逆序遍历数组
PHP的While循环和For循环是遍历一个数组最常用的方法。但是你怎样遍历像下面这个数组呢?

Array
(
  [0] => Array
    (
      [name] => Board
      [games] => Array
        (
          [0] => Array
            (
              [name] => chess
              [price] => 12.99
            )

          [1] => Array
            (
              [name] => checkers
              [price] => 9.99
            )
        )
    )
)

PHP标准库中有一个对集合的迭代器iterators类,它不仅仅能够用于遍历一些异构的数据结构(比如文件系统和数据库查询结果集),也可以对一些不知道大小的嵌套数组的遍历。比如对上面的数组的遍历,可以使用RecursiveArrayIterator迭代器进行:

 代码如下 复制代码

$iterator = new RecursiveArrayIterator($games);
iterator_apply($iterator, 'navigateArray', array($iterator));

function navigateArray($iterator) {
 while ($iterator->valid()) {
  if ($iterator->hasChildren()) {
   navigateArray($iterator->getChildren());
  } else {
   printf("%s: %s", $iterator->key(), $iterator->current());
  }
  $iterator->next();
 } 
}

执行该段代码会给出以下的结果:

name: Board
name: chess
price: 12.99
name: checkers
price: 9.99

过滤关联数组的结果
假定你得到了如下一个数组,但是你仅仅想操作价格低于$11.99的元素:

Array
(
  [0] => Array
    (
      [name] => checkers
      [price] => 9.99
    )

  [1] => Array
    (
      [name] => chess
      [price] => 12.99
    )

  [2] => Array
    (
      [name] => backgammon
      [price] => 29.99
    )
)

使用array_reduce()函数可以很简单的实现:

 代码如下 复制代码

function filterGames($game){
 return ($game['price'] < 11.99);
}

$names = array_filter($games, 'filterGames');

array_reduce()函数会过滤掉不满足回调函数的所有的元素,本例子的回调函数就是filterGames。任何价格低于11.99的元素会被留下,其他的会被剔除。该代码段的执行结果:

Array
(
  [1] => Array
    (
      [name] => checkers
      [price] => 9.99
    )
)

对象转换成数组
一个需求就是将对象转换成数组形式,方法比你想象的简单很多,仅仅强制转换就可以了!例子:

 代码如下 复制代码

class Game {
 public $name;
 public $price;
}

$game = new Game();
$game->name = 'chess';
$game->price = 12.99;

print_r(array($game));

执行该例子就会产生如下结果:

Array
(
[0] => Game Object
  (
    [name] => chess
    [price] => 12.99
  )
)

将对象转换成数组会出现一些不可预料的副作用。比如上面的代码段,所有的成员变量都是public类型的,但是对于private私有变量的返回结果会变得不一样。下面是另外一个例子:

 代码如下 复制代码

class Game {
 public $name;
 private $_price;

 public function setPrice($price)  {
  $this->_price = $price;
 }
}

$game = new Game();
$game->name = 'chess';
$game->setPrice(12.99);

print_r(array($game));执行该代码片段:

Array
(
[0] => Game Object
  (
    [name] => chess
    [_price:Game:private] => 12.99
  )
)

正如你所看到的,为了进行区分,数组中保存的私有变量的key被自动改变了。

数组的“自然排序”
PHP对于“字母数字”字符串的排序结果是不确定的。举个例子,假定你有很多图片名称存放于数组中:

 代码如下 复制代码

$arr = array(
 0=>'madden2011.png',
 1=>'madden2011-1.png',
 2=>'madden2011-2.png',
 3=>'madden2012.png'
);

你怎样对这个数组进行排序呢?如果你用sort()对该数组排序,结果是这样的:

Array
(
    [0] => madden2011-1.png
    [1] => madden2011-2.png
    [2] => madden2011.png
    [3] => madden2012.png
)

有时候这就是我们想要的,但是我们想保留原来的下标怎么办?解决该问题可以使用natsort()函数,该函数用一种自然的方法对数组排序:

 代码如下 复制代码

<?php
$arr = array(
 0=>'madden2011.png',
 1=>'madden2011-1.png',
 2=>'madden2011-2.png',
 3=>'madden2012.png'
);

natsort($arr);
echo "<pre>"; print_r($arr); echo "</pre>";
?>

运行结果:

Array
(
    [1] => madden2011-1.png
    [2] => madden2011-2.png
    [0] => madden2011.png
    [3] => madden2012.png
)

遍历过程中的改值操作
引用操作符&
看下面这段代码中的$array数组,在foreach循环时对$value使用引用操作符,这样在循环中修改$value的值的时候,便将$array中对应的元素值修改了。

 代码如下 复制代码

<?php
$array = array("A"=>1, "B"=>1, "C"=>1, "D"=>1);
foreach($array as &amp;$value)
    $value = 2;
print_r($array);
?>

上段代码的输出如下:

Array ( [A] => 2 [B] => 2 [C] => 2 [D] => 2 )
可以看到,$array中各个键对应的值都被修改成了2。看来这种方法确实奏效。

利用键值操作数组的元素
有的时候,数组中表示的可能是一些互相关联的元素,如果遇到了这些相互关联的元素中的一个,就将其他元素做一个标记的话,上面的引用肯定就不管用了。这时候修改这些关联元素的时候,就要使用其对应的键值了。先试试看管用不:

 代码如下 复制代码

<?php
$array = array("A"=>1, "B"=>1, "C"=>1, "D"=>1);
foreach($array as $key => $value){
    if($key == "B"){
        $array["A"] = "CHANGE";
        $array["D"] = "CHANGE";
        print_r($array);
        echo '<br />';
    }
 
    if($value === "CHANGE")
        echo $value.'<br />';
}
print_r($array);
?>

别着急看输出,我们想象中的应该是什么样呢?打印修改后的数组,打印一个“CHANGE”,再打印一遍修改后的数组。对吗?来看一下输出吧!

Array ( [A] => CHANGE [B] => 1 [C] => 1 [D] => CHANGE )
Array ( [A] => CHANGE [B] => 1 [C] => 1 [D] => CHANGE )
咦?怎么个情况?我们的CHANGE哪去了?

按照我们的想法,既然$array已经改变了,那么当遍历到键值为“D”的元素时,应当输出它的新值“CHANGE”才对!可是事实并不是我们想的那样。PHP在这里做了什么手脚呢?把上面的代码稍微修改一下。既然打印数组的时候,“D”=>CHANGE没错,那我们修改第二个if语句的判断条件:

 代码如下 复制代码

<?php
$array = array("A"=>1, "B"=>1, "C"=>1, "D"=>1);
foreach($array as $key => $value){
    if($key == "B"){
        $array["A"] = "CHANGE";
        $array["D"] = "CHANGE";
        print_r($array);
        echo '<br />';
    }
   
    if($array[$key] === "CHANGE")
        echo $value.'<br />';
}
print_r($array);
?>

猜猜它会输出什么?$value肯定不会等于“CHANGE”啦!难道等于1么?

 代码如下 复制代码
Array ( [A] => CHANGE [B] => 1 [C] => 1 [D] => CHANGE )
1
Array ( [A] => CHANGE [B] => 1 [C] => 1 [D] => CHANGE )

那么,它确实就是1了。

这究竟是神马原因呢?翻到PHP文档的foreach那页,恍然:

Note: 除非数组是被引用,foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。foreach对数组指针有些副作用。除非对其重置,在 foreach 循环中或循环后都不要依赖数组指针的值。

原来foreach所操作的是指定数组的一个拷贝。怪不得,取$value不管用了呢!理解到这里,上面的问题就解决了。只要在foreach中,直接按照键取$array中的元素进行各种判断赋值操作就可以了。


总结及延伸
PHP的数组遍历和操作能力确实非常强大,然而对一些稍复杂问题的解决方法却不是那么明显。其实在任何领域都是这样,一个语言和语法提供的都是基本的操作,对于复杂的问题的解决办法都需要开发者自己的思考、想象力和代码编写来完成。

验证手机号码我们都是利用php正则表达试验证了,手机号的规则是长度11位然后是13,15,18等等开头,这个我们只要加以分类规划并可实现完美手机号码验证正则了。

大家都应该有这个常识,中国的手机号码都是以数字“1”开头,然后利用“0~9”10个数字组成的11位

数字组合,那么我们的验证规则肯定要根据这个思路来写。
根据上面的简单思路,我们便可以写下以下的验证代码:

 代码如下 复制代码

    <?php  
    //本代码仅仅是提供一些思路  
    //距离实际应用还有一些距离  
     $mobile = '15858588585';  
    //下面的1便是手机的第一位数字必须为数字1  
    //[0-9]指后面的数字均为0~9的数字  
    //{9}这中间的9指的是手机号码除了第一位数外,其他要重复10次,刚好就是11位数了  
    if(!preg_match('/^1([0-9]{9})/',$mobile)) exit('您的手机号码不正确');  
    ?> 

但上面的代码显然是不够严谨的,因为这样,即使“18888888888”这样的手机号码也能通过验证了,因

此我们还要对其进行更为严格的验证,在严格之前请让我们先来看看中国常见的手机号码前三位都有那

些:

    移动手机号码:134、135、136、137、138、139、150、151、157(TD)、158、159、187、188  
    联通手机号码:130、131、132、152、155、156、185、186  
    电信手机号码:133、153、180、189、(1349卫通) 

那么根据上面的特征,我们就可以将代码修改成这样的规则了:

 代码如下 复制代码

    <?php
     function checkMobile($str)
     {
         $pattern = “/^(13|15)d{9}$/”;
         if (preg_match($pattern,$str))
         {
              Return true;
         }
         else
         {
             Return false;
         }
     }
    //调用函数
    $str = checkMobile(“15800000001″);
     if($str)
     {
     echo(“符合手机号码标准”);
     }
     else
     {
     echo(“不符合手机号码标准”);
     }
    ?>

上面只能骓13,15开头的,如果有新段就不行了,我们可加以修改

 代码如下 复制代码

    function is_mobile($str){  
    return preg_match("/^(((d{3}))|(d{3}-))?13d{9}$/", $str);  
    } 

这样就可以验证所有的手机号码了。

冒泡法排序与二分法查找排序算法是我们在初中时就学过的,下面我来介绍在PHP冒泡法排序与二分法查 找实例,各位同学不防进入参考。

 

 代码如下 复制代码

//冒泡法排序
//随便给出一个乱序数组
$arr = array(0,2,10,9,19,23,89,112,321,234);
//统计数组
$num = count($arr);
//冒泡倒序排列
for($i=0;$i<$num-1;$i++){
 for($m=0;$m<$num-1;$m++){
  if($arr[$m]<$arr[$m+1]){
   $temp = $arr[$m];
   $arr[$m] = $arr[$m+1];
   $arr[$m+1] = $temp;
  }
  // echo $arr[$m].'<br>';
 }
}
//输出排序后的结果
var_dump($arr);
//冒泡顺序排列
for($x=0;$x<$num-1;$x++){
 for($y=0;$y<$num-1;$y++){
  if($arr[$y]>$arr[$y+1]){
   $temp = $arr[$y];
   $arr[$y] = $arr[$y+1];
   $arr[$y+1] = $temp;
  }
 }
}
//输出排序后的结果
var_dump($arr);
//二分法查找
function dichotomy($array,$k,$low=0,$high=0){
 if(count($array)!= 0 && $high == 0){
  $high = count($array);
 }
 if($low <= $high){
  $mid = intval(($low+$high)/2);
  if( $array[$mid] == $k ){
   return $mid;
  }elseif( $k<$array[$mid]){
   return dichotomy( $array,$k,$low=0,$mid-1);
  }else{
   return dichotomy( $array,$k,$mid+1,$high);
  }
 }else{
  return false;
 }
}
//输出查找结果
echo dichotomy($arr,23);

今天简单的研究了一下最常用的冒泡法排序与二分法查找,写了一个简单的案例,加强自己对php的学习

,也希望对今后php学习者能提供一点点的帮助。

[!--infotagslink--]

相关文章

  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • PHP成员变量获取对比(类成员变量)

    下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
  • php 获取用户IP与IE信息程序

    php 获取用户IP与IE信息程序 function onlineip() { global $_SERVER; if(getenv('HTTP_CLIENT_IP')) { $onlineip = getenv('HTTP_CLIENT_IP');...2016-11-25
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • php获取一个文件夹的mtime的程序

    php获取一个文件夹的mtime的程序了,这个就是时间问题了,对于这个问题我们来看小编整理的几个例子,具体的操作例子如下所示。 php很容易获取到一个文件夹的mtime,可以...2016-11-25
  • 如何获取网站icon有哪些可行的方法

    获取网站icon,常用最简单的方法就是通过website/favicon.ico来获取,不过由于很多网站都是在页面里面设置favicon,所以此方法很多情况都不可用。 更好的办法是通过google提供的服务来实现:http://www.google.com/s2/favi...2014-06-07
  • iOS设置UIButton文字显示位置和字体大小、颜色的方法

    这篇文章给大家分享了iOS如何设置UIButton的文字显示位置和字体的大小、颜色,文中给出了示例代码,相信对大家的学习和理解很有帮助,有需要的朋友们下面来一起看看吧。...2020-06-30
  • php数组操作 键名比较 差集 交集赋值

    本文章提供在量的数据中级操作实例有如对键名比较计算数组的差集 计算差集 给指定数组中插入一个元素 反转数组 交集赋值新的数组实例。 //定义回调函数 funct...2016-11-25
  • C#二维数组基本用法实例

    这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • php curl模拟post请求和提交多维数组的示例代码

    下面一段代码给大家介绍php curl模拟post请求的示例代码,具体代码如下: <&#63;php$uri = "http://www.cnblogs.com/test.php";//这里换成自己的服务器的地址// 参数数组$data = array ( 'name' => 'tanteng'// 'passwor...2015-11-24
  • C#数组的常用操作方法小结

    Array数组在C#中同样是最基本的数据结构,下面为大家C#数组的常用操作方法小结,皆为细小的代码段,欢迎收看收藏...2020-06-25
  • jquery如何获取元素的滚动条高度等实现代码

    主要功能:获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 :$(window).width(); 获取页面的文档高度 $(document).height(); 获取页面的文档宽度 :$(document).width();...2015-10-21
  • C#实现字符串转换成字节数组的简单实现方法

    这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
  • jquery获取div距离窗口和父级dv的距离示例

    jquery中jquery.offset().top / left用于获取div距离窗口的距离,jquery.position().top / left 用于获取距离父级div的距离(必须是绝对定位的div)。 (1)先介绍jquery.offset().top / left css: 复制代码 代码如下: *{ mar...2013-10-13
  • Jquery 获取指定标签的对象及属性的设置与移除

    1、先讲讲JQuery的概念,JQuery首先是由一个 America 的叫什么 John Resig的人创建的,后来又很多的JS高手也加入了这个团队。其实 JQuery是一个JavaScript的类库,这个类库集合了很多功能方法,利用类库你可以用简单的一些代...2014-05-31
  • C# 拷贝数组的几种方法(总结)

    下面小编就为大家带来一篇C# 拷贝数组的几种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • PHP 二维数组根据某个字段排序的具体实现

    本文记录的要实现的功能类似于 MySQL 中的 ORDER BY,上个项目中有遇到这样的一个需求。 要求:从两个不同的表中获取各自的4条数据,然后整合(array_merge)成一个数组,再根据数据的创建时间降序排序取前4条。 遇到这个...2014-06-07
  • c#将字节数组转成易读的字符串的实现

    这篇文章主要介绍了c#将字节数组转成易读的字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • C#获取字符串后几位数的方法

    这篇文章主要介绍了C#获取字符串后几位数的方法,实例分析了C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • jquery获取tagName再进行判断

    如果是为了取到tagName后再进行判断,那直接用下面的代码会更方便: $(element).is('input') 如果是要取到标签用作到别的地方,可以使用一下代码: $(element)[0].tagName 或: $(element).get(0).tagName...2014-05-31