数组(三)

/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/

 

// 数组函数讲解

/*
count 函数
作用:计算数组的单元个数[或对象的属性个数]

注:count函数的参数,可以是数组,也可以是"非数组"
返回值分3种情况讨论
1: 数组/对象, 返回数组的单元个数/对象的属性个数
2: NULL ,返回0
3: 非数组,也非NULL,通通返回1
*/


$arr = array('a','b','c','d');
echo count($arr),'<br />'; // 4

$str = 'abcd';
echo count($str),'<br />'; // 1

$nul = null;
echo count($nul),'<br />'; // 0

 

//====再深入一点===//
$arr = array('a','b','c',array('d','e'));
echo count($arr),'<br />'; // 4,l因为$arr第1层确实就4个单元


// 刚才答5的同学,思路值得夸张,因为他用到了递归的思想,
// 即,某单元如果是数组,继续进去数单元数量.

echo count($arr,true),'<br />'; // 6

/*
第2个参数为true时,代表递归的来计算数组的单元个数

第1层 a,b,c, array(d,e) == 4个单元
array(d,e) 又是数组,进该数量继续数.
数出 d,e 2个单元

共6个
*/


$arr = array('a','b','c',array('d',array('e','f')));

echo count($arr,true),'<br />';

/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/

 

/*
array_key_exists
数组 键 存在, 用来判断数组有没有某一个键
*/


$arr = array('age'=>98,'height'=>176,'area'=>'北京',0=>'哈哈','kaka'=>NULL);

echo $arr['age'],'<br />';

echo $arr['abc'],'<br />';

// 能不能先判断数组有没有某单元?

/*
有2个办法,用isset
*/

if(isset($arr['age'])) {
echo $arr['abc'];
} else {
echo '$arr["abc"]不存在<br />';
}

 

// 用函数 array_key_exists来判断
if(array_key_exists('abc',$arr)) {
echo '有abc键';
} else {
echo '$arr["abc"]不存在<br />';
}


var_dump(isset($arr['kaka'])); // false
var_dump(isset($arr[0])); // true


/*
用isset和array_key_exists来判断
有什么区别呢?

 

1:
isset 不是函数,是语法结构
而array_key_exists是函数

速度上,isset省去了一次函数调用,速度要快些.

2:isset来判断是根据值来判断的,
如果某个单元的值 为 NULL,依然是返回false
因为 isset是靠值来判断的.

如果对于键/值的都不固定,不确定是否有NULL存在,
请用 array_key_exists来判断


3: isset是用来判断变量是否设置的,不限于数组

// 如果数组是动态生成,不好判断单元值及键值时,用array_key_exists保险
*/

/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/

 

// array_flip
// 交换键值, 即值做键,键做值
echo '<pre>';

$arr = array(0=>'a',1=>'b',2=>'c');

print_r($arr); // Array ( [0] => a [1] => b [2] => c )
print_r(array_flip($arr)); // Array ( [a] => 0 [b] => 1 [c] => 2 )
print_r($arr); // 原数组没变,只是做为参数传给函数而已.


/*
疑问,如下情况
键值对调后,出现2个'b'键,
而数组的键,不可能重复的.
这种情况怎么处理?
*/
$arr = array(0=>'a',1=>'b',2=>'b',3=>'c');

print_r($arr);
print_r(array_flip($arr));

/***
分析:
array('a'=>0,'b'=>1,'b'=>2,'c'=>3); // 后面的b=>2覆盖了前面的1
***/


echo '</pre>';

/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/

 

// 刚才 我们用 array_key_exists 来判断数组的某个"键"存不存在
// 能否,有一个函数,判断某个值存不存在呢?
// 答:有 in_array

 

/*
题目: 老师把全班同学的名字,都放在一个数组里,
姓名非常多,让你找有没有叫"小刚"的同学.

你要怎么办?

思路: 用foreach循环数组,把每个数组单元的值与"小刚"比较
*/

$arr = array('小明','小华','老王','小刚','老李');


// 手写函数来完成
function inarray($search,$arr) {
$find = false;

foreach($arr as $v) {
if($v === $search) {
$find = true;
break;
}
}

return $find;
}


if(inarray('小刚',$arr)) {
echo '有小刚<br />';
} else {
echo '没有小刚<br />';
}


if(inarray('铁刚',$arr)) {
echo '有铁刚<br />';
} else {
echo '没有铁刚<br />';
}


/**
多学一行知识,就能少写一行代码

没必要自己写这个函数,系统直接有此函数.
**/

if(in_array('小刚',$arr)) {
echo '有小刚<br />';
} else {
echo '没有小刚<br />';
}


if(in_array('铁刚',$arr)) {
echo '有铁刚<br />';
} else {
echo '没有铁刚<br />';
}

/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/

 

/*
要求,给定整数m,n m<n
生成一个数组,单元的值分别是 m,m+1,m+2 ..... n

自己写函数的思路?
用for循环来生成数组

*/
echo '<pre>';

function arraynum($m,$n) {
$arr = array();

for($i=$m;$i<=$n;$i++) {
$arr[] = $i;
}

return $arr;
}
print_r(arraynum(1,10));

// 又让你写一个函数,计算数组所有单元的值和和
// 思路:循环数组单元,不断相加. 此函数同学们试着写

 

/*
但是,如果数组函数熟练的话,这2个函数不必我们写
range() : 生成一个指定范围的数组
array_sum(): 计算数组所有单元的值的和
*/

$arr = range(1,10);
print_r($arr);
echo array_sum($arr);

 

// 经理又提问,这是为了做一个抽奖程序,因此想把数组打乱,没有规律
// js中,数组没有现在的函数来打乱,需要自己写函数.

if(shuffle($arr)) {
echo '打乱成功';
print_r($arr); // 数组本身被打乱了,因为shuffle函数,是引用传值
}

// 比如搞随机抽查,或者随机生成验证码时,就能用到shuffle函数

echo '</pre>';

/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/

 

echo '<pre>';
/*
经理说: 我们在网上采集一批QQ号, 都装在了数组里
但因为是大面积采集的,因此,有很多QQ号是重复的.
能否去重????


自己写函数的思路:

建立一个空数组 A
循环待处理数组 B

取出每一个单元,先判断A中有没有此单元,
如没有,加入进去
如有,跳过.
*/


// 其实不必动手写函数, array_unique
$arr = array('a','b','a','c','d','e','f','f','f');

$uni = array_unique($arr);
print_r($uni);


/*
注意点:
1:键名没改变
2:值重复的话,取先出现的键值放在返回数组里.
*/

 

function uni($arr) {
$uni = array();

foreach($arr as $k=>$v) {
if(!in_array($v,$uni)) {
$uni[$k] = $v;
}
}

return $uni;
}


print_r(uni($arr));

echo '</pre>';

/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/

 

echo '<pre>';


/*
经理又说了,刚才给1,100,生成1,2...100的数组
我想给你100,1,生成100,99,98..... 1这样的数组
*/
print_r(range(10,1));


/*
经理说,偏给你一个不规则的数组
比如array('a'=>'东','f'=>'南','z'=>'西','y'=>'北');

让你写函数得到 array('北','西','南','东');
即:把数组的顺序调过来

思路:
新建一个空数组A,
把待处理数组B foreach循环

循环,{
取B的一个单元
放A的最前面
}
*/
$arr = array('a'=>'春','b'=>'夏','c'=>'秋','d'=>'冬');

print_r($arr);
print_r(array_reverse($arr));

 

$arr = array('春','夏','秋','冬');
print_r($arr);
print_r(array_reverse($arr)); // 此时,对于索引数组,索引没调过来,只调换的值

// 如果想强制把索引也调过来,可以加第2个参数
print_r(array_reverse($arr,true));

 

// 注意:对于纯整型的索引数组,反转时,要注意,默认不转键的顺序,只转值的顺序.
echo '</pre>';

/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/

 

echo '<pre>';
/***
先说一点数据结构的知识
队列,栈


队列,就像人排队
来新人,站队伍的后面
要挑人走,队伍最前面的先出去.
特点:先进先出

 

栈: 就像堵住了出口的单行道.
|a b c d

路被堵了,出去时, d先出
特点:后进先出
**/

 

/***
数组完全可以达到队列和栈的效果
需要用到以下几个函数
array_push
array_pop
array_shift
array_unshift
***/


// array_push 往数组尾部追加单元
$arr = array();
print_r($arr);

echo '现在有',array_push($arr,'东'),'个单元了<br />';
print_r($arr);


echo '现在有',array_push($arr,'南'),'个单元了<br />';
print_r($arr);

echo '现在有',array_push($arr,'西'),'个单元了<br />';
print_r($arr);


echo '现在有',array_push($arr,'北'),'个单元了<br />';
print_r($arr);

/***
1: array_push的作用是 往数组的尾部压入单元
2: 返回值是: 压入单元成功后,数组的单元个数
3: array_push是引用传值,直接影响参数数组本身
***/

 

// array_pop, 是把数组的尾部单元的值弹出来,并且把尾部单元去掉
echo array_pop($arr),'<br />'; // 北
print_r($arr); // 东,南,西.


echo array_pop($arr),'<br />'; // 西
print_r($arr); // 东,南

echo array_pop($arr),'<br />'; // 南
print_r($arr); // 东

echo array_pop($arr),'<br />'; // 东
print_r($arr); // array() 空数组

var_dump(array_pop($arr)); // null;
print_r($arr); // array() 空数组


/**
array_pop 总结
1: 作用是弹出并去掉最后一个单元
2: 返回值是弹出的值
3: array_pop是引用传参,直接影响参数数组的值
**/

echo '</pre>';

/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/

 

echo '<pre>';

$arr = array('东','南','西','北');
echo array_shift($arr),'<br />'; // 东
print_r($arr); // 南,西,北

echo array_shift($arr),'<br />'; // 南
print_r($arr); // 西 ,北


/***
总结:
1: array_shift作用是 弹出并剪切数组的第一个单元
2: 返回是弹出的单元值
3: array_shift是引用传参,为影响参数数组
4: array_shift在剪切首单元之后,学会把索引重新整理,从0开始计数.
但, 如果是字符串做键,则不受影响.
***/

 


$arr = array();

echo '现在有',array_unshift($arr,'东'),'个单元了<br />';
print_r($arr);

echo '现在有',array_unshift($arr,'南'),'个单元了<br />';
print_r($arr);


echo '现在有',array_unshift($arr,'西'),'个单元了<br />';
print_r($arr);


echo '现在有',array_unshift($arr,'北'),'个单元了<br />';
print_r($arr);


/**
array_unshift总结
1: 作用是把单元追加到数组的头部
2: 返回值是追加后,新数组的单元个数
3: 引用传参,影响参数的值
4: 在头部新加单元后, 索引从0重新排
**/

echo '</pre>';

/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/

 

// 自定义函数,反转数组


/**
从前到后读数组单元
读出来的值,放备用数组的头部
**/
function rev1($arr) {
$rev = array();

foreach($arr as $v) {
array_unshift($rev,$v);
}

return $rev;
}


$arr = array('a'=>'春','b'=>'夏','c'=>'秋','d'=>'冬');
print_r(rev1($arr));
/**
这个函数不够好,因为反转后,键是从0开始排的,这是array_unshift的特点
**/

 

/**
从后往前读数组,读出来的单元,追加到一个备用数组里
**/
$arr = array('a'=>'春','b'=>'夏','c'=>'秋','d'=>'冬');
function rev2($arr) {
$rev = array();
while(count($arr)) {
$v = array_pop($arr);
array_push($rev,$v);
}

return $rev;
}
print_r(rev2($arr));
// 同样不能保持键值


/***
思考题:
如何反转数组,并保持原来的键值????
***/

/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/

 


echo '<pre>';
// 数组面试题
/*
1: 如何给数组追加一个单元

答: array_push() 函数
也可以直接赋值 $arr['key'] = value;
*/


/*
如何给数组排序
可以用sort,asort,ksort
*/

$arr = array('39','78','57','99');
print_r(sort($arr));
print_r($arr); // 从小到大排序了. 更强的用法,自己看手册


/*
字符串和数组怎么取长度?
答:字符串用 strlen ,mb_strlen
数组用count

如果用count计算字符串长度,返回1
*/


/**
用数组知识完成下题
把 '1234567'转换成'1,234,567'

用刚学的数组的模拟栈与队列来做
**/

/*
function formstr($str) {
$bak = array();
$arr = str_split($str);

$i = 0;

while($cnt = count($arr)) {
array_unshift($bak,array_pop($arr));
$i++;
if($i%3==0 &&) {
array_unshift($bak,',');
}
}

return implode($bak);
}

$str = '1234567';
print_r(formstr($str));echo '<br />'; // 1,234,567

$str = '123456';
print_r(formstr($str));echo '<br />'; // ,123,456 前面多了逗号
*/


function formstr($str) {
$bak = array();
$arr = str_split($str);

$i = 0;

while($cnt = count($arr)) {
array_unshift($bak,array_pop($arr));
$i++;
if($i%3==0 && $cnt != 1) { // $cnt!=1的意义仔细思考一下
array_unshift($bak,',');
}
}

return implode($bak);
}

$str = '1234567';
print_r(formstr($str));echo '<br />'; // 1,234,567

$str = '123456';
print_r(formstr($str));echo '<br />'; // ,123,456 前面多了逗号

posted on 2012-10-13 11:10  besile  阅读(205)  评论(0)    收藏  举报