php数组高级小结(一)
<?php
/**
* php5.4新增数组定义
*/
$items1 = [ 'a','b','c' ];
$items2=[ 'name'=>'andy','age'=>52 ]; print_r($items1);
print_r($items2);
<?php /**
* 功能描述:把以下数组中 address相同的值合并,count的值相加。这个问题经常会遇到
* $items = array(
* array("address"=>"美国", "count"=>123),
* array("address"=>"美国", "count"=>34),
* array("address"=>"中国", "count"=>2),
* array("address"=>"中国", "count"=>20),
* array("address"=>"法国", "count"=>345)
* );
* 处理后变为:
* $items = array(
* array("address"=>"美国", "count"=>157),
* array("address"=>"中国", "count"=>22),
* array("address"=>"法国", "count"=>345)
* );
*/ $items = array(
array("address"=>"美国", "count"=>123),
array("address"=>"美国", "count"=>34),
array("address"=>"中国", "count"=>2),
array("address"=>"中国", "count"=>20),
array("address"=>"法国", "count"=>345)
); $map = array();
foreach($items as $item){
$key = $item['address'];
/**
* isset和array_key_exists的区别
*/
//if(isset($map[$key]])){
if(array_key_exists($key,$map)){
$map[$key]['count'] += $item['count'];
}else{
$map[$key] = $item;
}
} print_r(array_values($map));
<?php /**
* array_multisort — 对多个数组或多维数组进行排序
*/ /** 一 ############################################################################
* 第一个数组是要排序的主要数组。
* 第二个数组中的项目顺序完全和第一个数组中相应的项目顺序一致。
* 数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序
*/
$ar1 = array("a","b","d", "c");
$ar2 = array(1, 3, "2", 1);
array_multisort($ar1, $ar2); /** 二 ############################################################################
* 本例中 data 数组中的每个单元表示一个表中的一行。
* 这是典型的数据库记录的数据集合。
* 例子中的数据如下:
* volume | edition
* -------+--------
* 67 | 2
* 86 | 1
* 85 | 6
* 98 | 2
* 86 | 6
* 67 | 7 * 数据全都存放在名为 data 的数组中。
* 这通常是通过循环从数据库取得的结果,例如 mysql_fetch_assoc()。
*/ $data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7); /**
* 本例中将把 volume 降序排列,把 edition 升序排列。
* 现在有了包含有行的数组,但是 array_multisort() 需要一个包含列的数组
* ,因此用以下代码来取得列,然后排序。
*/ // 取得列的列表
foreach ($data as $key => $row) {
$volume[$key] = $row['volume'];
$edition[$key] = $row['edition'];
} // 将数据根据 volume 降序排列,根据 edition 升序排列
// 把 $data 作为最后一个参数,以通用键排序
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data); print_r($data); /**
* 数据集合现在排好序了,结果如下:
* volume | edition
* -------+--------
* 98 | 2
* 86 | 1
* 86 | 6
* 85 | 6
* 67 | 2
* 67 | 7
*/
<?php
/**
* usort — 使用用户自定义的比较函数对数组中的值进行排序
* 这个方法再某些方面真的很实用,针对这个方法会单独写个文章
*/ /**
* 二维数组排序,很简单的一个方法
* 下例二维数组按id排序,array_multisort也可实现
*/
$items=array(
array('id'=>12,'name'=>'张三' ,'age'=>18),
array('id'=>8,'name'=>'李四' ,'age'=>30),
array('id'=>19,'name'=>'王五' ,'age'=>10),
array('id'=>4,'name'=>'赵六' ,'age'=>39),
array('id'=>86,'name'=>'孙七' ,'age'=>6),
); usort($items,function($itema,$itemb){
return ($itema['id'] -$itemb['id']);
}); print_r($items);
<?php
/**
* 从m个数中选出n个数来 ( 0 < n <= m), 要求n个数之间不能有重复,其和等于一个定值k, 求一段程序,罗列所有的可能。
* @param int $need 定值
* @param array $arr 选取的数组集合
* @return array 符合的子集合
*/
function sel_set($need, $arr) {
//子集数2的数组元素数次方
$arr_count = count($arr);
$set_count = pow(2, $arr_count); /**
* 此方法原理: 对于集合{a, b, c}
* 针对其中的元素都有2种状态1在子集中0不在
* 0=>0 0 0 空集不需要考虑
* 1=>0 0 1 => c
* 2=>0 1 0 => b
* 3=>0 1 1 => b c
* 4=>1 0 0 => a
* 5=>1 0 1 => a c
* 6=>1 1 0 => a b
* 7=>1 1 1 => a b c
* 也就是将每个子集对应的编号转化为二进制 再去数组取对应元素
*/ //set_arr用来存放符合需求的子集
$set_arr = array(); //set_count个子集,所以循环set_count次
for( $i = 1; $i < $set_count; $i++ ) {
//tmp用来存放每次子集
$tmp = array(); //将子集对应编号转化二进制
$dec = decbin($i); //数组集合有arr_count个元素,所以将二进制左补0为对应位,以便取数组元素
$dec = str_pad($dec, $arr_count, 0, STR_PAD_LEFT); //对该二进制数循环 判断是否为1
for( $j = 0; $j < $arr_count; $j++ ) { //如果当前位为1, 则将数组对应元素放入子集数组,字符串($dec)可当数组操作
if( 1 == $dec[$j] ) {
array_push($tmp, $arr[$j]);
}
}
//判断当前子集之和是否等于设定的定值,符合则存入set_arr
if( $need == array_sum($tmp) ) {
array_push($set_arr, json_encode($tmp));
}
} //返回符合要求的集合
return $set_arr;
}
//要进行选取的数组,及定值
$need = 18;
$arr = array(11, 18, 12, 1, -2, 20, 8, 10, 7, 6); print_r( sel_set($need, $arr) );
php数组高级小结(一)的更多相关文章
- shell 之awk 关联数组高级应用
最近由于数据迁移过,有些用户信息需要再次确认下,也许数据量比较大,但是需要最终确认的比如说是用户ID和其对应的用户积分数,这样就会导致出现文本a(老的数据),文本b(新的数据).比如 这是文本a.tx ...
- php常用数组函数小结
count函数 作用:计算数组中元素的个数或对象的属性个数 返回值: 数组或者对象, 返回数组的单元个数或者对象的属性个数 Null,返回0 非数组,也非NULL,通通返回1 <?php $ar ...
- java 13-1 数组高级二分查找
查找: 1.基本查找:数组元素无序(从头找到尾) 2.二分查找(折半查找):数组元素有序 pS:数组的元素必须有顺序,从小到大或者从大到小.以下的分析是从小到大的数组 二分查找分析: A:先对数组进行 ...
- php数组使用小结
在PHP中,数组分为两类:索引数组和关联数组.二者可以单独使用,也可以混合使用. 1.一维数组 一维数组的定义也很简单,常用的有如下两种方式: 1.1 直接赋值 1: <?php 3: $dwq ...
- Java数组练习题小结
//2015/07/07 //Java数组小小练习题 /* 3. 写一个函数,计算一个整数数组的平均值 4. 自定义一个整数数组a,读入一个整数n,如果n 在数组中存在,则输出n 的下标:如果不存在, ...
- 13-02 Java 数组高级算法,Arrays类
冒泡排序 冒泡排序原理 冒泡排序代码: package cn.itcast_01; /* * 数组排序之冒泡排序: * 相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处 */ pub ...
- perl数组高级
1 去除一个数组中的重复元素: 使用grep函数代码片段: 代码: my @array = ( 'a', 'b', 'c', 'a', 'd', 1, 2, 5, 1, 5 ); my %count; ...
- 面向对象(基础oop)之结构与数组高级
大家好,我叫李京阳,,很高兴认识大家,之所以我想开一个自己的博客,就是来把自己所了解的知识点通过自己的话写一下,希望被博客园的朋友们点评和一起讨论一下,也希望从博客园中多认识一些软件开发人员!现在我开 ...
- javascript jquery数组操作小结
----------------------------------------------------------定义数组-------------------------------------- ...
随机推荐
- 七个结构模式之适配器模式(Adapter Pattern)
定义: 将一个接口转换为客户需要的另外一个接口,使接口不兼容的类型可以一起工作,也被称为包装器模式(Wrapper Patern). 结构图: Target:目标抽象类,客户所需要的接口. Adapt ...
- 关于javascript的一些知识以及循环
javascript的一些知识点:1.常用的五大浏览器:chrome,firefox,Safari,ie,opera 2.浏览器是如何工作的简化版:3.Js由ECMAjavascript;DOM;BO ...
- 开发apple pay碰到的问题总结
本来想简单总结一下Apple Pay 开发过程中的几个问题, 结果被下面这篇文章全碰上了, 干脆全文转载, 作者对相关资源整理得比较详细, 比较有参考价值 总的来说, 我们做过 APNs 推送的话, ...
- 如何订阅Form的自定义事件
Window Form类有很多的属性/方法和事件,其中事件属于一种发布订阅模式 .订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主体对象.这个主体对象在自身状态变化时,会通知所 ...
- FancyBox - 经典的 jQuery Lightbox 插件
FancyBox 是一款非常优秀的弹窗插件,能够为图片.HTML 内容和其它任务的多媒体内容提供优雅的弹出缩放效果.作为是最流行的 Lightbox 插件之一,可以通过 fitToView 实现自适应 ...
- 【web前端优化之图片模糊到清晰】看我QQ空间如何显示相片
前言 此篇文章估计不会太长,有移除首页的风险,但是老夫(称老夫是因为我们真正的叶小钗其实都100多岁啦)是不会怕滴.所以,我来了哟! 题外话:今天我们一起还看了一道前端的面试题,而后我本来还想多找几道 ...
- javascript --- 实时监听输入框值的变化
实时监听文本框值变化是非常常见的功能,通常最简单的办法就是用keyup,keydown来实现,但是这种方法有两个问题,一个是当直接复制粘贴的时候没法监听到事件,另外一个问题是在移动端,使用删除键删除输 ...
- Egret白鹭H5小游戏开发入门(一)
前言: 好久没更新博客了,以前很多都不会,所以常常写博客总结,倒是现在有点点经验了就懒了.在过去的几个月里,在canvas游戏框架方面,撸过了CreateJS,玩得了Egret,又学过PIXI.js. ...
- css中的background属性
第一次写博客,我就写写今天在编写网页的过程中,对background的两种运用,一是background中的线性渐变,对背景的渐变我其实是很少使用的,所以今天在写的时候我用css3的帮助手册,back ...
- 高性能JS笔记4——算法和流程控制
一.循环 for.while.do while三种循环的性能都没有多大区别.foreach 的性能较其他三种差 . 既然循环没有多大区别,注意循环内的代码控制. 减少迭代次数. 减少迭代工作量. 推荐 ...