该功能主要用到 array_filter() 函数,这个函数可以用回调函数过滤数组中的单元。用法:

array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )

依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 TRUE,则传入数组的当前值会被包含在返回的结果数组中,数组的键名保留不变。

其中,flag 可以指定传入回调函数是数组的键值、元素值、还是键值和元素值两者都有。默认情况下只传入元素值,如果要根据键值,flag需要设置为 ARRAY_FILTER_USE_KEY ,不过只有PHP5.6.0及之后的版本才能直接使用这个参数,之前的版本需要额外处理,文章最后我们会提供处理的代码。

我们就是利用这样的特性获取奇偶数组,如下。

1 根据键值(key)提取

<?php
function odd($var)
{
// 返回$var最后一个二进制位,
// 为1则保留(奇数的二进制的最后一位肯定是1)
return($var & 1);
} function even($var)
{
// 返回$var最后一个二进制位,
// 为0则保留(偶数的二进制的最后一位肯定是0)
return(!($var & 1));
} $array1 = array("a"=>1, "4"=>2, "5"=>3, "d"=>4, "e"=>5);
$array2 = array(6, 7, 8, 9, 10, 11, 19); echo "奇数:\n";
print_r(array_filter($array1, "odd", ARRAY_FILTER_USE_KEY)); echo "偶数:\n";
print_r(array_filter($array2, "even", ARRAY_FILTER_USE_KEY));
?>

注意:传入的数组需是索引数组,也就是下标是数字的数组,其他类型下标的元素会导致输出不准确。

2 根据元素值(value)提取

根据元素值提取与根据键值的唯一区别是,传给array_filter的是哪一个。如果根据元素值,array_filterflag 直接为空,保留默认值即可。

<?php
function odd($var)
{
// 返回$var最后一个二进制位,
// 为1则保留(奇数的二进制的最后一位肯定是1)
return($var & 1);
} function even($var)
{
// 返回$var最后一个二进制位,
// 为0则保留(偶数的二进制的最后一位肯定是0)
return(!($var & 1));
} $array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array(6, 7, 8, 9, 10, 11, 12); echo "奇数:\n";
print_r(array_filter($array1, "odd"));
echo "偶数:\n";
print_r(array_filter($array2, "even"));
?>

3 简化写法

例如,在以上的例子中,我们根据偶数下标提取元素,可以通过匿名函数简化实现,如下:

<?php
$array = array(6, 7, 8, 9, 10, 11, 12); $array_odd = array_filter($array2, function($var) {
return ($var & 1);
}, ARRAY_FILTER_USE_KEY); print_r($array_odd);
?>

如果是PHP 5.6.0之前的版本,需要额外处理,如下:

<?php
$array = array(6, 7, 8, 9, 10, 11, 12); $keys = array_filter(array_keys($array), function($key) {
return ($key & 1);
}); $array_odd = array_intersect_key($array, $keys);
?>

文章转自:https://www.awaimai.com/891.html

关注微信公众号:lovephp

PHP提取奇数或偶数下标元素的更多相关文章

  1. PHP 提取数组中奇数或偶数的元素array_filter

    //提取奇数 $filter = array_filter($ql,function($var){ return($var & 1); },ARRAY_FILTER_USE_KEY); pri ...

  2. CSS奇数、偶数、指定数样式

    原文: https://blog.csdn.net/wangjia200913/article/details/49615325 语法    :nth-child(an+b) 第一种:简单数字序号写法 ...

  3. 剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)

    题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输 ...

  4. 剑指offer:调整数组顺序使奇数位于偶数前面

    题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 分析 事实上,这个题比较简单,很多种方式都可以实现,但是其时间复杂度或空间复 ...

  5. 循环赛日常表算法(N可为奇数和偶数)

    一. 实验题目 设有n位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天必须比赛一场,不能轮空.试按此要求为比赛安排日程. 二.实验目的 1.深刻理解并掌 ...

  6. 《剑指offer》面试题14 调整数组顺序使奇数位于偶数前面 Java版

    (输入整数数组,使所有奇数位于前半部分,所有偶数位于后半部分.) 我的方法:想到用两个下标分别表示奇数和偶数的界线,一个在开头,一个在末尾,判断每一个数字的类别,然后将它放入对应的范围内,移动下标,直 ...

  7. 剑指Offer面试题:13.调整数组顺序使奇数位于偶数前面

    一.题目:调整数组顺序使奇数位于偶数前面 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 例如有以下一个整数数组:12345 ...

  8. php如何实现原址排序数组使奇数位于偶数前面(代码)

    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 1.遍历数组,判断元素奇数偶数 ...

  9. 《剑指offer》 调整数组顺序使得奇数在偶数前面

    本题来自<剑指offer> 调整数组顺序使得奇数在偶数前面 题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分, ...

随机推荐

  1. Oracle数据库分割字符串function方法

    下面我直接上传一串代码源码, create or replace function strsplit(p_value varchar2, p_split varchar2 := ',') --usag ...

  2. mysql常用的优化措施

    http://www.cnblogs.com/ggjucheng/archive/2012/11/07/2758058.html

  3. Vue.js - Day2

    品牌管理案例 添加新品牌 删除品牌 根据条件筛选品牌 1.x 版本中的filterBy指令,在2.x中已经被废除: filterBy - 指令 ​<tr v-for="item in ...

  4. vue-样式问题

    问题: 今天在用vue开发单页面应用的时候,遇到一个问题,在A页面,直接刷新,页面的布局样式之类的是没有问题的,不过在B页面跳转到A页面,那么A页面有一些样式就不是预期的效果. 发现解决问题: 用调试 ...

  5. CSS中的鼠标样式明细

    <INPUT   TYPE="submit"   style="cursor:   hand"   value="hand">  ...

  6. 力不从心 Leetcode(ugly number heap) 263, 264,313

    Leetcode ugly number set (3 now) new ugly number is generated by multiplying a prime with previous g ...

  7. php之判断点在多边形内的api

    1.判断点在多边形内的数学思想:以那个点为顶点,作任意单向射线,如果它与多边形交点个数为奇数个,那么那个点在多边形内,相关公式: <?php class AreaApi{ //$area是一个多 ...

  8. Buffer实例

    互联网的基础是数据的传送,一切都围绕着数据展开,比如发送啊,接收啊,这一切都离不开网络,通过之前,学会了通过http模块来搭建一个服务器,也实现了网络爬虫,nodejs中网络的部分,Net这个模块,对 ...

  9. http知识补充

    在我的职业生涯中,没怎么重视过这http四个字,想当然的觉得不就是个网页请求嘛就没怎么当回事,而且很多http相关的长篇大论一听就困,真心是弄不下去,但是就是这种观念导致我后期的工作中不断的挖坑,不断 ...

  10. caffe resize用interpolation

    opencv的resize默认的是使用双线性插值INTER_LINEAR,也可以是尝试其他的方式进行插值操作 if (param.random_interpolation_method()) { // ...