PHP学习记录--基础篇

2023-10-30

一、变量定义

<?php
//变量定义
	$var1;
	$var2 = 1;
	$var1 = 2;
	echo $var2,'<br/>',$var1,'<br/>';
	unset($var1);//删除变量
//变量传值
	$a = 'b';
	$b = 'Hello world!';
	echo $$a,'<br/>';
//常量定义
	define('P1',1);//函数定义
	const P2 = 2;//关键字定义
	echo P1;
	//两种定义方式访问权限有区别
	define('-_-','smile');
	echo '<br/>',constant('-_-');//特殊符号不能直接使用
//特殊常量
/*在PHP中还有一些特殊的常量,他们有双下划线开始+长两名+双下划线结束,这种常量称
	之为系统魔术常量:魔术常量的值通常会跟着环境变化,但是用户改变不了。
	__DIR__:当前被执行的脚本所在电脑的绝对路径
	__FILE__: 当前被执行的脚本所在的电脑的绝对路径(带自己文件的名字)
	__LINE__:当前所属的行数。
	__NAMESPACE__: 当前所属的命名空间。
	__CLASS__:当前所属的类+
	__METHOD__:当前所属的方法。
	*/
	echo '<br/>',__DIR__,'<br/>',__FILE__,'<br/>',__LINE__,'<br/>',__LINE__;
	echo '<br/>',__LINE__;
//数据类型,PHP是一种弱类型语言,变量本身没有数据类型
	/*在PHP中将数据分为三大类八小类:
	简单(基本)数据类型: 4个小类。
		整型: int/integer, 系统分配4个字节存储,表示整数类型(有前提)。
		浮点型: float/double, 系统分配8个字节存储,表示小数或者整型存不下的整数。
		字符串型: string, 系统根据实际长度分配,表示字符串(引号)小
		布尔类型: bool/boolean, 表示布尔类型,只有两个值: true 和falses
	复合数据类型: 2个小类。
		对象类型:object,存放对象(面向对象)。
		数组类型:array,存储多个数据(- -次性)
	特殊数据类型: 2个小类。
		资源类型: resource,存放资源数据(PHP外部数据,如数据库、文件)和
		空类型: NULL, 只有一个值就是NULL (不能运算) 4*/
//类型转换
	/*1.自动转换 2.强制转换:(转换类型)需转换变量      (int)$a;*/
	echo '<hr/>';
	$a = 'abc1.1.1';
	$b = '1.1.1abc';
	echo '<br/>','<br/>',$a+$b;//自动转换
	echo '<br/>',(float)$a,'<br/>',(float)$b;//强制转换
//类型判断
	//var_dump()方法是判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值并回返数据类型
	//用var_dump里面的变量必须是存在的,如果变量存在但值是空的就会返回false;没有变量则返回NULL
	echo '<hr/>';
	var_dump(is_int($a));
	var_dump(is_string($a));
	//gettype(变量名):获取变量类型
	//settype(变量名,'数据类型'):改变数据类型
	echo '<hr/>',gettype($a),'<br/>';
	settype($a,'int');
	// var_dump(settype($a,'int'));
	echo Gettype($a);
	echo '<hr/>';
//整数类型
	$a1 = 110;//十进制
	$a2 = 0b110;//2进制
	$a3 = 0110;//8进制
	$a4 = 0x110;//16进制
	echo $a1,'~',$a2,'~',$a3,'~',$a4,'<hr/>';//php中默认输出为10进制
	//进制转换,利用内置函数
	/*
	1、2进制转换为10进制函数:bindec(str),反过来10进制转换为2进制:decbin(str)
	2、8进制转换为10进制函数:octdec(str),反过来10进制转换为8进制:decoct(str)
	3、16进制转换为10进制函数:hexdec(str),反过来10进制转换为16进制:dechex(str);这个函数会自动忽略字符中的非16进制字符.返过来10进制转换为16进制:dechex(str)
	4、任意进制转换函数:base_convert(参数1,参数2,参数3)
		参数1要转换的数字,参数2数字本身的进制,参数3要转为的目的进制
	*/
//浮点类型
	$f1 = 1.23;
	$f2 = 1.23e10;  
	$f3 = PHP_INT_MAX + 1;//整形超出自身存储大小会用浮点型表示
	var_dump($f1,$f2,$f3);
	echo '<hr/>';
//运算符(PHP中有10中)
	/*
	赋值运算符:
		赋值运算,符号为  =  :
	算术运算符:+;-;*;/;%:取余
	比较运算:>;<;>=;<=;
		==:大小相等
		!=:大小不相等
		===:(全等于),大小及数据类型均相同
		!===:不全等
	逻辑运算符:&&(与);||(或);!(非)
	连接运算符:
		.  :将两个字符串连接到一起($a.$b)
		.= :复合运算($a.=$b等于$a = $a.$b)
	错误抑制符:在PHP中有一些错误可以提前预知,但是这些错误可能无法避免,
				但是又比希望报错给用户看,可以使用错误抑制符处理
		@:在可能出错的表达式前面使用@符号即可。
	三目运算符:
		表达式1 ? 表达式2 :  表达式3;
		运算:表达式1成立,则执行表达式2;否则执行表达式3
	自操作运算:
		++;--
		衍生符号:+=;-=;*=;/=;%=
	*/
	$a = 10;
	$b = 0;
	//$a / $b;
	@($a /$b);
	echo '<hr/>';
	//位运算符:位运算:取计算机中最小单位(位bti)进行运算
	/*	
		&:按位与,两个位均为1,结果为1,否则为0
		|:按位或,两个有一个为1,结果为1
		~:按位非,一个位如果为1则变成0,否则反之。
		^:按位异或,两个相同则为0,不同则为1
		<<:按位左移,整个位(32位),向左移动一位,右边补0v
		>>:按位右移,整个位向右移动一位,左边补符号位对应内容(正数补0,负数补1) v .
	*/
	$a = 5;
	$b = -5;
	var_dump($a & $b);
	/*
	5原码: 00000101
	-5原码:11111011
	& :    00000001 (最终结果)
	转换为原码:判断符号位,0正数(原码),1负数(补码)
	*/
	var_dump($a>>1);//右移一位
	var_dump($a>>2);//右移两位
//运算符优先级
?>

二、循环结构

<?php
//if分支
    /*if(){

    }elseif(){

    }elde{

    }
    */
//switch分支
    /*switch(条件表达式($a)){
            case 值1:    //$a == 值1
                执行代码段;
                break;
            case 值2:
                执行代码段;
                break;
            default:
                匹配失败代码段;
                break;
    }
    */
//循环结构
    /*for循环:
        for(条件表达式1;条件表达式2;条件表达式3){
            循环体
        }
    while循环:
        while(条件表达式){
            循环体
        }
    do while循环:
        do{
            循环体
        }
        while(条件表达式);
    */
for($i = 1;$i<=10;$i++){
    echo $i,' ';
}
echo '<br/>';
$i = 1;
while($i<=10){
    echo $i,' ';
    $i++;
}
echo '<br/>';
do{
    $i--;
    echo $i,' ';
}while($i>1);
//循环控制
/*因为循环经常性会碰到嵌套(循环中间包含循环),如果在循环内部有些条件下,明确可以
知道当前循环(或者说外部循环)不需要继续执行了,那么就是可以使用循环控制来实现:
其中内部循环也可以控制到外部,就是通过使用层级参数。
Continue 2; 当前自己循环后面内部不再执行,同时外部循环如果还有循环体也不再执行,重新来过;
Break 2;当前自己循环结束,同时外部也结束(如果还有外部不受影响,继续执行p。
*/
?>

<table border="1">
    <?php for($i = 1;$i<10;$i++){?>
         <tr>
            <?php for($j = 1;$j<=$i;$j++){?>
                <td>
                    <?php echo $i.'*'.$j.'='.$i*$j;  ?>
                </td>
            <?php }?>
        </tr>
     <?php }?>
</table>
<table border="1">
    <?php for($i = 1;$i<10;$i++):?>
         <tr>
            <?php for($j = 1;$j<=$i;$j++):?>
                <td>
                    <?php echo $i.'*'.$j.'='.$i*$j;  ?>
                </td>
            <?php endfor;?>
        </tr>  
     <?php endfor;?>
</table>
<?php
//流程控制代替语法
/*
if:    if(){}      if():   endif;
switchi:   switch(){}      switchi():    endswitch;
for:   for(){}     for():  endfor;
while foreach同理
*/

//文件加载
    include_once 'index.php';//默认当前目录
    /*
    ./    当前目录
    ../   上一级目录
    */
?>

三、函数

<?php
//输出函数
    print('Hello world!<br/>');
    echo print('Hello world!<br/>');
    $a = 'Hello world<br/>';
    print_r($a);//类似var_dump(),不输出数据类型
//时间函数
    echo date('Y年m月d日 H:i:s',123456789),'<br/>';//123456对应的时间
    echo time(),'<br/>';
    echo microtime(),'<br/>';
    echo('------------------------');
//函数
/*
定义:
    function 函数名(参数){
        函数体;
    }
*/
test();
function test($a='分割线'){
    echo '</br>-----',$a,'-----</br>';
}
/*
参数详解
形参:形參:形式參数,不具有实际意义的参数,是在函数定义时使用的参数+
实参:实参:实际参数,具有实际数据意义的参数,是在函数调用时使用的参数。
形参是实参的载体:实参在调用时通常是需要传入到函数内部参与计算(运算),那么需要
在函数内部去找到实际数据所在的位置才能找到数据本身:需要实际调用的时候,将数据以
实参的形式传递给形参:给形参赋值,从而使得函数内部可以用到外部数据。。
默认值:
引用传递:在传入数据时必须传入变量。只有变量能够引用传递
    function 函数名(形参1,&形参2){
        函数体;
    }
*/
$c = 2;
echo add(1,1),'</br>';
echo add($c,1);
function add($a,$b){
    return $a + $b; //renturn后函数体不执行,直接结束
}
test();
jian(2,1);
echo '-----';
jian();
function jian($a=1,$b=1){
    echo $a-$b,'</br>';
}
test();
function display($a,&$b){
    $a = $a*$a;
    $b = $b*$b;
    echo $a,'---',$b;
}
$a = 10;
$b = 3;
display($a,$b);
echo '</br>',$a,'---',$b,'</br>';
test();
//作用域
//默认代码空间:全局空间
$global = 'global area';  //最终会被系统 纳入到超全局变量:$GLOBALS['global']中
$a = 11;


function area(){
    $inner = 1;  //局部变量,外部无法访问;
    global $inner2;//利用global实现局部和全局互访;
    $inner2 = 1;
    //echo $global;//无法访问全局变量

    echo $GLOBALS['global'],'---',$GLOBALS['a'],'</br>';
}
//如果想函数内部使用外部变量:除了$GLOBALS之外,通过参数传值( 如果要统一战线还可以使用引用传值)。4 .
area();
echo $inner2;
test();
//静态变量 static $*;
function sta(){
    $a = 1;
    static $b = 1;
    echo $a++,'---',$b++,'</br>';
}
sta();
sta();
sta();
//可变函数
test('可变函数');
function f1(){
    echo __FUNCTION__;
    echo '------可变函数-----';
}
$func = 'f1';
$func();//可变函数
test();
//将一个用户定义的函数传入给另外一个函数(函数名)去使用的
//过程,称之为回调过程,而被传入的函数称之为回调函数
function fun1($a,$b){
    return $a($b);
}
function fun2($a){
    return $a*$a;
}
echo fun1('fun2',10);
test('匿名函数');
$funcn = function(){
    echo '我是匿名函数</br>';
};
$funcn();
test('闭包函数');
function funb(){
    $name = __FUNCTION__;
    $innerfun = function() use($name){//use就是将外部变量保留给内部
        echo $name,'--';
    };
    $innerfun();
}
funb();
?>

四、文件加载原理

//test.php
<?php
    echo 'Hello,world!','</br>';
    echo '-------------</br>';
    $a=1;
    define('b','3.14');
?>
<?php
//文件加载原理
include 'test.php';
echo $a,'----',b;
include_once 'test.php';
echo '-------';
require 'test.php';
    //require和include区别:
    /*
    include要求较低:如果包含出错,后续代码继续执行。
    Require要求较高:如果包含出错,后续代码不再执行。
    */
//路径加载(绝对路径/相对路径)
    /*   
    ./  :当期那文件夹
    ../ :上一文件夹
    */
//文件嵌套包含
test('ss');
?>

五、错误处理

<?php
function f($a='分割线'){
    echo '</br>-----',$a,'-----</br>';
}
/*伪类型主要有两种:在三大类八小类之外。
Mixed:混合的,可以是多种PHP中的数据类型。
Number:数值的,可以是任意数值类型(整形和浮点型)。*/

//函数
//有关数学函数
/*max():指定参数中最大的值←
min():比较两个数中较小的值。
rand):得到一个随机数,指定区间的随机整数+
mt rand):与rand一样,只是底层结构不一样,效率比rand高(建议使用)。
round():四舍五入小
ceil):向上取整+
floor():向下取整。
pow():求指定数字的指定指数次结果: pow(2,8) == 2^8 == 256+
abs():绝对值←
sgrt():求平方根*/

/*有关函数的函数
function_exists():判断指定的函数名字是否在内存中存在(帮助用户不去使用-一个不存在的
函数,让代码安全性更高)。
func_get_arg(): 在自定义函数中去获取指定数值对应的参数+
func_get_args(): 在自定义函数中获取所有的参数(数组)。
func_num_args(): 获取当前自定义函数的参数数量+*/

//错误处理
/**错误分类
 * 一、语法错误
 * 二、运行时错误
 * 三、逻辑错误
 */
/**错误代码
 * 一、系统错误
 * E_PARSE: 编译错误,代码不会执行。
 * E_ERROR: fatal error,致命错误,会导致代码不能正确继续执行(出错的位置断掉)。
 * E_WARNING:warning,警告错误,不会影响代码执行,但是可能得到意想不到的结果。
 * E_N0TICE: notice, 通知错误,不会影响代码执行。
 * 二、用户错误
 * E_ _USER_ ERROR, E_ USER_ _WARNING, E_ USER_ _NOTICE。
 * 用户在使用自定义错误触发的时候,会使用到的错误代号(系统不会用到)。
 * 三、其他
 * E_ ALL,代表着所有从错误(通常在进行错误控制的时候使用比较多),建议在开
 * 发过程中(开发环境)使用。
 * 
 * 所有以E开头的错误常量(代号)其实都是由一个字节存储,然后每一种错误占据一个对应
 * 的位,如果想进行- -些错误的控制,可以使用位运算进行操作。
 * 例:
 *      排除通知级别notice: E_ALL&~E_NOTICE
 *      只要警告和通知: E_WARNING|E_NOTICE
 */
/**错误触发 */
header('Content-type:text/html;charset=utf-8');//必备

f();
$a = 1;
$b = 0;
if($b == 0){
    //认为触发错误
    trigger_error('发生错误');//默认notice,代码会继续执行
//    trigger_error('发生错误',E_USER_ERROR);//默认error,代码停止
}
echo $a/$b;
f('错误显示设置');
/**一、PHP的配置文件:全局配置: php.ini 文件。
 * Display_ errors:是否显示错误。on/off
 * Error_ reporting: 显示什么级别的错误。
 * 二、在运行的PHP脚本中设置:在脚本中定义的配置项级别比
 * 配置文件高j(通常在开发当中都会在代码中去进行控制和配置)。
 * Error reporting(): 设置对应的错误显示级别。
 * Ini_set('配置 文件中的配置项,,配置值)。
 * Ini_set('error.. reporting'E ALL);
 * Ini_set('display_ errors,1);
 */
f('错误日志设置');
/**在实际生产环境中,不会直接让错误赤裸裸的展示给用户:
 * 1、不友好。
 * 2、不安全:错误会暴露网站很多信息(路径、文件名)、
 * 所以在生产环境中,一般不显示错误( 错误也比较少),但是不可能避免会出现错误(测试
 * 的时候不会发现所有的问题),这个时候不希望看到,但是又希望捕捉到可以让后台程序员
 * 去修改:需要保存到日志文件中,需要在PHP配置文件中或者代码中(ini_set)设置对应
 * error_log配置项。
 * 1、开启日志功能
 *  log_errors = On
 * 2、指定路径
 *  error_log = 路径
 */
f('自定义错误处理');
/**最简单的错误处理: trigger_errors()函数,但是该函数不会阻止系统报错。
 * PHP系统提供了一种用户处理错误的机制:用户自定义错误处理函数,然后将该函数增加到操
 * 系统错误处理的句柄中,然后系统会在碰到错误之后,使用用户定义的错误函数。
 * set_error_handler()前两个参数必须存在
 * 
 * 
 * 
 */
function my_error($errno,$errstr,$errfile,$errline){
    //判断当前会碰到哪些错误
    if(!(error_reporting()&$errno)){
        return false;
    //error_reporting没有参数代表获取当前系统错误处理对应的级别
    }//错误类型库中不存在
    //开始判断错误类型
    switch($errno){
        case E_ERROR:
        case E_USER_ERROR:
            echo 'fatal error in file'.$errfile.'on line'.$errline.'</br>';
            echo 'error info:'.$errstr;
            break;
        case E_WARNING:
        case E_USER_WARNING:
            echo 'warning in file'.$errfile.'on line'.$errline.'</br>';
            echo 'error info:'.$errstr;
            break;
        case E_NOTICE:
        case E_USER_NOTICE:
            echo 'notice in file'.$errfile.'on line'.$errline.'</br>';
            echo 'error info:'.$errstr;
            break;
    }
    return true;
}
//修改错误机制
set_error_handler('my_error');//将自定义错误处理加入到系统错误处理句柄中
?>

六、字符串

<?php
header('Content-type:text/html;charset=utf-8');
function f($a='分割线'){
    echo '</br>-----',$a,'-----</br>';
}
f('字符串');
$str1 = 'hello';//单引号字符串
$str2 = "hello";//双引号字符串
var_dump($str1,$str2);
//引号方式:比较适合定义那些比较短(不超过一行) 或者没有结构要求的字符串。
//如果有结构要求,或者内容超过一行,可以使用以下两种结构定义。
f();
/**
 * nowdoc字符串:没有单引号的单引号字符串
 *  $str = <<<边界符
 *       字符串
 * 边界符;
 * heredoc字符串:没有双引号的双引号字符串
 * $str = <<<边界符
 *       字符串
 * 边界符;
 * 
 * 结构化定义字符串变量的规则:。
 * 1、结构化定 义字符串对应的边界符有条件:
 * 1.1上边界符后面不能跟任何内容,包括空格和注释;
 * 1.2下边界符必须放在最左边;
 * 1.3下边界同样后面只能跟分号,不能跟任何内容;
 * 
 * 2、结构化定义字符串的内部 (边界符之间)的所有内容都是字符串本身
 */
$str3 = <<<EOD
    Hello
        world
EOD;
//heredoc结构
$str4 = <<<'EOD'
    Hello
        world
EOD;
//nowdoc结构
var_dump($str3,$str4);
echo $str3,'-------',$str4;
f('结构化规则');
$a = '哈哈';
// $str11 = <<<EOD
// //这是弹出内容
//     <script>
//         alert('$a');
//     </script>
// EOD;
echo $str11;
f('字符串转义');
/**字符串转义
 * \' :输出'
 * \" :输出"
 * \r :代表回车(理论上是回到当前行首位置)
 * \n :换行
 * \t :类似tab键,输出4个空格
 * \$ :输出$
 * 
 * 单引号和双引号区别:
 *  1.单引号中可以识别:\'  而双引号中不能识别\'
 *  2.双引号中可以识别$,所以可以解析变量
 *      解析规则:(1):应保证变量的独立性,不要让系统难以区分
 *                  错误示范:$str8 =  "abc$bdef";
 *                (2):使用变量专业标识符 {$b} 区分
 */
$str5 = 'abc\r\ndef\'\"\$fg';
$str6 = "abc\r\ndef\'\"\$fg";
echo $str5,'</br>',$str6;
f();
$b = 123;
$str7 = 'abc $b def';
$str8 =  "abc $b def";
echo $str7,'</br>',$str8;
f('字符串长度相关');
/**
 * (1)基本函数strlen():得到字符串长度(字节为单位)
 * (2)多字节字符串的长度问题:包含中文的长度。
 * (3)多字节字符串扩展模块: mbstring扩展(mb: Multi Bytes)*    首先需要加载PHP的mbstring扩展。配置文件更改
 * Mbstring扩展针对的是一些关于字符统计: strlen. 只是针对标准交换码ASCII, mtstring
 * 会针对不同的字符集。
 * mb_strlen('字符串','字符集')*/
$strl1 = 'abcdefg';
$strl2 = '哈哈123';//UTF-8下中文占3个字节
echo strlen($strl1),'</br>',strlen($strl2);
echo '<hr/>';
echo mb_strlen($strl1),'</br>',mb_strlen($strl2,'utf-8');
f('字符串相关函数');
/**
 * 1)转换函数: implode(), explode(), str. split()o
 * Implode(连接方式,数组):将数组中的元素按照某个规则连接成一个字符串
 * Explode(分割字符,目标字符串):将字符串按照某个格式进行分割,变成数组
 *        中国|北京|顺义== array('中国','北京','顺义');
 * Str_split(字符串,字符长度):按照指定长度拆分字符串得到数组。
 * 2)去除函数: trim(), ltrim(), rtrim()
 * Trim():本身默认是用来去除两边的空格(中间不行),但是也可以指定要去除的内容,是按
 * 照指定的内容循环去除两边有的内容:直到碰到一个不是目标字符为至
 * ltrim():去除左边的
 * rtrim():去除右边的
 * 3)截取函数: substr(), strstr()
 * Substr(字符串,起始位置从0开始[长度]):指定位置开始截取字符串,可以截取指定长度(* 指定到最后)* Strstr(字符串,匹配字符):从指定位置开始,截取到最后(可以用来取文件后缀名) .
 * 4)大小转换函数: strtolower(), strtoupper(), ucfirst()* Strtolower:全部小写
 * Strtoupper:全部大写
 * Ucfirst:首字母大写
 * 5)查找函数
 * Strpos():判断字符在目标字符串中出现的位置(首次)* Strrpos():判断字符在目标字符串中最后出现的位置。
 * 6)替换函数: str_replacel()
 * Str_replace(匹配目标,替换的内容,字符串本身):将目标字符串中部分字符串进行替换I
 * 7)格式化函数: printf(), sprntf()
 * printf/sprntf(输出字符串有占位符)
 * %% - 返回一个百分号 %
 * %b - 二进制数
 * %c - ASCII 值对应的字符
 * %d - 包含正负号的十进制数(负数、0、正数)
 * %e - 使用小写的科学计数法(例如 1.2e+2* %E - 使用大写的科学计数法(例如 1.2E+2* %u - 不包含正负号的十进制数(大于等于 0* %f - 浮点数(本地设置)
 * %F - 浮点数(非本地设置)
 * %g - 较短的 %e 和 %f
 * %G - 较短的 %E%f
 * %o - 八进制数
 * %s - 字符串
 * %x - 十六进制数(小写字母)
 * %X - 十六进制数(大写字母)
 * 8)其他: str_repeat(), str_shuffle()
 * str_repeat(字符串,n):重复字符串n次
 * str_shuffle(字符串):随机打乱字符串
*/
$string1 = ' abCd efDb ';
$string2 = 'hijk';
// f();
var_dump(str_split($string1,3));
f();
var_dump(trim($string1));
f('截取');
echo substr($string1,3,2),'-----',strstr($string1,'e');
f('大小写转换');
echo strtoupper($string1),'-----',strtolower($string1),'-----',
ucfirst($string2);
f('查找函数');
echo strpos($string1,'b'),'-----',strrpos($string1,'b');
f('替换函数');
echo str_replace('b','是',$string1);
f('格式化函数');
$age = 20;
$name = 'TOM';
echo sprintf("你好,我叫%s,今年%d岁",$name,$age);
f('其他');
echo str_repeat($string2,2),'----',str_shuffle($string2);
?>

七、数组

<?php
header('Content-type:text/html;charset=utf-8');
function f($a='分割线'){
    echo '</br>-----',$a,'-----</br>';
}
echo '数组</br>';
/**数组的定义方法
 * 1、使用array关键字
 * $变量 = array(元素1,元素2,..);
 * 2、使用中括号来包裹数据
 * $变量 = [元素1,元素2,..];
 * 3、隐形定义数组,给变量加一个中括号,系统自动变成数组
 * $变量[] = 值1;
 * $变量[下标] = 值;$a[10] = 1;$a[] = 2;则a[11] = 2; 
 */
$arr1 = array('1','2','3','haha');
$arr2 = ['3','2','1','haha'];
var_dump($arr2);
f();
$arr3[] = 1;
$arr4[5] = 5; 
$arr5[] = '1';
$arr6['key'] = 'key';
echo var_dump($arr3),'</br>',var_dump($arr4),'</br>',
      var_dump($arr5),'</br>',var_dump($arr6);
f(); 
/**数组特点
 * 1)可以整数 下标或者字符串下标。
 * 如果数组下标都为整数:索引数组
 * 如果数组下标都为字符串:关联数组
 * 2)不同下标可以混合存在:混合数组。
 * 3)数组元素的顺序以放入顺序为准,跟下标无关
 * 4)数字下标的自增长特性 :从0开始自动增长如果中间手动出现较大的,那么后面的自
 * 增长元素从最大的值+1开始
 * 5)特殊值下标的自动转换
 * 布尔值: true和false --> 1/0
 * 空: NULL --> 空
 * 6)PHP中数组元素没有类型限制,没有长度限制
 * 补充:PHP中的数组是很大的数据,所以存储位置是堆区,为当前数组分配一块连续的内存。
 */
$arry1[false] = 'false';
$arry1[true] = 'true';
$arry1[null] = 'null';
var_dump($arry1);
f('多维数组:数组中的元素又是数组');
/**多维数组
 * 二维数组:数组中所有的元素都是一维数组
 * 在二维的数组元素中可以继续是数组,在PHP中维数不限,但不建议使用超过三维的数组,
 * 会增加访问的复杂度,降低访问效率
 */
$info = array(//二维数组
    array('name' => 'Jim','age' => 30),
    array('name' => 'Tom','age' => 28),
    array('name' => 'Lily','age' => 21)//最后一个元素后面可以不跟 , 号
);
var_dump($info);
/**异形数组
 * 异形数组:数组中的元素不规则,有普通基本变量也有数组。
 * 在实际开发中,并不常用,尽量让数组元素规则化(便于进行访问)。
 */
f('数组遍历');
/**数组遍历
 * 数组遍历:普通数组数据的访问都是通过数组元素的下标来实现访问,如果说数组中所有的
 * 数据都需要依次输出出来,就需要我们使用到一些简化的规则来实现自动获取下标以及输出
 * 数组元素。
 * 
 * Foreach遍历语法:
 * 基本语法如下:
 * 基本语法如下:。
 * Foreach(数组变量 as $下标 => $值){
 *  通过$下标访问元素的下标;通过$值访问元素的值
 * }
 * 通常:如果是关联数组(字母下标),就需要下标,如果是数字下标
 * 在进行数据存储定义的时候,通常二维数组不会两个维度的key下标都为数字,一般是一维
 * 为数字(无意义),二维为字符串(数据库表字段),所以在进行遍历的时候,通常是只需要
 * 针对一-维进行遍历,取得二维数组元素,然后二维数组元素通过下标去访问。
 * Foreach遍历原理.
 * Foreach.遍历的原理:本质是数组的内部有一颗指针, 默认是指向数组元素的第一个元素,
 * foreach就是利用指针去获取数据,同时移动指针
 * 1、foreach, 会重置指针:让指针指向第一-个元瓢 
 * 2、进入foreach循环:通过指针取得当前第一个元素,然后将下标取出放到对应的下标变
 * 量$k中(如果存在),将值取出来放到对应的值变量Sv中; (指针下移)。
 * 3、进入到循环内部(循环体),开始执行;
 * 4、重复2和3,直到在2的时候遇到指针取不到内容(指针指向数组最后) ψ
 */
$arry2 = array(7,6,5,4,3,2,1); 
foreach($arry2 as $i){
    echo $i,'---';
}
foreach($arry2 as $k => $i){
    echo 'key:',$k,'== ',$i,'<br/>';
}
f('For 循环遍历数组');
/**For 循环遍历数组
 * For循环:基于已知边界条件(起始和结束)然后有条件的变化(规律)小
 * 因此: for 循环遍历数组有对应条件。
 * 1、获取数组长度 : count数组)得到数组元素的长度。
 * 2、要求数组下标是规律数组
 */
for($i = 0;$i < count($arry2);$i++){
    echo $arry2[$i],'---';
}
f('While配合each和list遍历数组');
/**While配合each和list遍历数组
 * While是在外部定义边界条件,如果要实现可以和for循环。4
 * Each函数使用: each 能够从一一个数组中获取当前数组指针所指向的元素的下标和值,拿到
 * 之后将数组指针下移,同时将拿到的元素下标和值以-个四个元素的数组返回: 
 *  0标 => 取得元素的下标值
 *  1下标 => 取得元素的值
 *  Key下标 => 取得元素的下标值
 *  Value下标 => 取得元素的值
 * 
 * List函数使用: list是一种结构,不是一种函数(没有返回值),是list提供一堆变量去从一
 * 个数组中取得元素值,然后依次存放到对应的变量当中(变量为变量赋值:值来源于数组):
 * list必须从索引数组中获取数据,而且必须从0开始
 * 
 * List与each配合特别好: each一定有两个元素就是0和1下标元素
 * List(变量1.变量2) = each(数组); //是一种赋值运算,但是可以得到false 结果(each职
 * 不到正确的结果),整个表达式为falsey
 * 
 */
$a  = array(1,'name' => 'TOm',3,'age' => 30);
// echo '<pre>';
// print_r(each($a));
// print_r(each($a));
// print_r(each($a));
// print_r(each($a));
// var_dump(each($a));
$arry3 = array(1,2,3 => 1);
list($first) = $arry3;
var_dump($first);
f();
// while(each($a)){
//     list($key,$value) = each($a);
//     echo 'key is:  '.$key.'  value is:  '.$value.'<br/>';
// }
//改进
while(each(list($key,$value) = each($a))){
    echo 'key is:  '.$key.'  value is:  '.$value.'<br/>';
}
f('数组相关函数');
/**1)排序函数:对数组元素进行排序,都是按照ASCII码进行比较
 * sort():顺序排序(下标重排)
 * rsert():逆序排序
 * asort():顺序排序(下标保留)
 * arsort():逆序排序
 * ksort():顺序排序;按照键名
 * krsort):逆序排序
 * shuffle():随机打乱数组元素,下标重排
 * 2)指针函数
 * reset():重置指针,将指针重回首位,返回值为true/false
 * end();重置指针,指针指到最后一个元素
 * next():指针下移,取得下一个元素值
 * prev():指针上移,取得上一个元素的值
 * current(): 获取当前指针对应的元素值
 * key()获取当前指针对应下标值
 * 
 * 注意事项: next和prev会移动指针,有可能导致指针移动到最前或者最后(离开数组),导
 * 致数组不能使用,通过next和prev不能回到正确的指针位置,只能通过end和resert重置
 * 
 * 3)其他函数
 * count():统计数组元素数量
 * array_push():在数组中加入一个元素(数组后面)
 * array_Pop():在数组中取出一个元素(数组后面)
 * array_shift():在数组中取出一个元素(数组前面)
 * array_unshift():在数组中加入一个元素(数组前面)
 * PHP模拟数据结构:
 * 栈:先进后出
 * 队列:先进先出
 * 
 * array_reverse():数组元素反过来
 * in_array():判断一个元素在数组中是否存在
 * array_keys();获取一个数组的所有下边,返回一个索引数组
 * array_values():获取一个数组的所有值,返回一个索引数组
 * 
 */
$sarr = array(4,8,1,3,2,0);
$sort_arr = sort($sarr);
for($i = 0;$i < count($sarr);$i++){
    echo $sarr[$i],'---';
}
f('PHP模拟数据结构');
$arr = array();
array_push($arr,3);
array_push($arr,2);
array_push($arr,1);
print_r($arr);
echo '---',array_pop($arr),array_pop($arr),array_pop($arr),'</br>';//栈
$arrt2 = array();
array_unshift($arrt2,3);
array_unshift($arrt2,2);
array_unshift($arrt2,1);
print_r($arrt2);
echo '---',array_pop($arrt2),array_pop($arrt2),array_pop($arrt2);
?>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP学习记录--基础篇 的相关文章

  • 在 PHP 中接受带有小数点和千位分隔符的国际数字

    对于用户可以输入能量值来计算相应费用的在线计算器 我需要 PHP 脚本来接受各种用户输入 200 万又四分之一焦耳 的值可以输入为 2000000 25 默认表示法 2 000 000 25 带千位分隔符 2000000 25 逗号作为小数
  • 点击 %40 变为 %2540

    当单击包含 符号的链接时 该网址给我 40 这就是我想要的 但是一旦我点击它 一秒钟后它就在我点击后变成了 2540 单击是在电子邮件内 然后定向到网站 其中 40 更改为 2540 我怎样才能让它停止变化 它现在得到这样的参数 email
  • 使用 ImageMagick (PHP) 将 2 个图像并排合并为 1 个图像

    我认为这是一件容易的事 我有 2 张图片 JPG 我希望它们合并成一张图片 其中 2 张图片并排 所以我有图片 A 和图片 B 我想要图片 AB 并排 两个图像具有相同的宽度和高度 在本例中 宽度 200px 高度 300px 但是第二个图
  • 如何将图像从 Android 应用程序上传到网络服务器的特定文件夹中

    如何将图像从 android 移动到 Web 服务器上的指定文件夹 这是我的安卓代码 package com example bitmaptest import java io ByteArrayOutputStream import ja
  • 正则表达式上的换行符

    我试图替换两个标签之间的所有内容 但我无法构建正确的表达式 这就是我所做的
  • 在 PHP 中包含 PHP 文件

    我有一个网站 它运行 PHP if 语句来根据附加文件的类型 即 Jpg Txt MP4 显示内容 所以我显示 TXT 文件的代码是 if post attachment txt display attachment div class d
  • 防止 Propel 插入空字符串

    当未设置列时 如何防止 Propel ORM 插入空字符串 CREATE TABLE user uid INTEGER PRIMARY KEY AUTO INCREMENT email VARCHAR 255 NOT NULL UNIQUE
  • 如何让Apache服务index.php而不是index.html?

    如果我将以下行放入index html文件 使 Apache 包含index php file 参观index html页面向我显示了这个 这是为什么 为什么它实际上不包含 PHP 文件 正如其他人指出的那样 您很可能没有 html设置为处
  • php源代码到PO文件生成器

    我必须将我的所有回显 打印字符串转换为PHP源代码代码文件到PO file 为了语言翻译 有批次吗对流器可用于相同的 我如何做到这一点 make gettext在您的服务器上运行 setup a 翻译适配器 例如带有 gettext 适配器
  • 使用 ImageMagick 和 PHP 将 PNG 转换为 JPG 并将透明背景设置为白色

    将图像从 PNG 转换为 JPEG 时 如何使用 ImageMagick 带有 php 扩展 将透明背景设置为白色 在撰写本文时 您尚未指定正在使用哪个扩展 但如果您使用命令行 则命令将是 convert image png backgro
  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • 如何对 SQL 进行多次查询

    我正在尝试创建一个表 并在 PHP 脚本的帮助下在数据库中插入一些值 虽然只插入 1 行 但效果很好 当我尝试输入更多行数时 出现错误 我需要为每个查询编写完整的插入语句 因为我正在使用在线 Excel 到 SQL 查询转换器
  • PHP 无法加载动态库“php_pdo_oci.dll”

    我在 Windows 8 上运行 Apache 2 4 7 和 PHP 5 5 9 我安装了 PHPUnit 并开始弹出此警告图像 警告 是的 我在 php ini 中启用了扩展加载以及 extension dir 以更正文件夹 并且该文件
  • 从类似 cronjob 的语法创建“下次运行时间”日期

    在我正在创建的应用程序中 用户可以安排重复任务 生成间隔模式的简单值是 Minute 0 59 90 each minute Hour 0 23 90 each hour Day of month 1 31 90 each day of m
  • 未传递“client_reference_id”参数

    我使用 Stripe Checkout Stripe 版本 2016 07 06 我想通过参数 client reference id 恢复个性化数据 但在 JSON 中 当我有金额或电子邮件时 我找不到它 我是在测试环境中 你能帮我吗 先
  • 使用 Instagram Basic Display API 时出现“无效平台应用程序”错误

    我正在尝试使用 Instagram Basic 显示 API 但是当我发布授权代码以获取访问令牌时 我不断收到以下错误 error type OAuthException 代码 400 error message 平台应用无效 我正在遵循此
  • 在 Yii 的标准中如何获得计数 (*)

    我正在尝试构建一个具有以下内容的查询group by属性 我正在尝试得到id和count它一直告诉我count is invalid列名 我怎样才能得到count来自group by询问 工作有别名 伊伊 1 1 11 其他不及格 crit
  • 使用 json_encode() 函数在 PHP 数组中生成 JSON 键值对

    我正在尝试以特定语法获取 JSON 输出 这是我的代码 ss array 1 jpg 2 jpg dates array eu gt 59 99 us gt 39 99 array1 array name gt game1 publishe
  • WordPress 自定义帖子类型未显示在搜索结果中

    我在 WordPress 中遇到自定义帖子类型 测验 和搜索的问题 自定义帖子类型未显示在我的搜索结果页面中 我的搜索结果中仅显示默认的帖子内容 以下是我使用的代码 函数 php函数create posttype register post
  • phpActiveRecord 日期时间格式不正确

    当尝试使用 phpActiveRecord 在表中创建记录时 出现以下错误 Invalid datetime format 1292 Incorrect datetime value 2013 06 20 11 59 08 PDT for

随机推荐

  • Java面试题整理-高并发篇

    1 synchronized的实现原理以及锁优化 synchronized原理分析 遇见更好的自己 的博客 CSDN博客Java 高并发专题之synchronized关键字1 synchronized作为jvm关键字有三个作用域synchr
  • rancher部署

    Rancher 管理 Kubernetes 集群 Rancher 简介 Rancher 是一个开源的企业级多集群 Kubernetes 管理平台 实现了 Kubernetes 集群在混合云 本地数据中心的集中部署与管理 以确保集群的安全性
  • 在脚本中 使用数组 获取列表中选中的复选框id + 获取选中的单选框的值

    var chk value 定义一个数组 input name communicateTeacher claIds checked each function 遍历每一个名字为interest的复选框 其中选中的执行函数 chk value
  • Pandas提取指定行列

    取列 1 通过列名称来提取指定列 推荐 列名 irline sentiment gold name negativereason gold retweet count text get data data airline sentiment
  • kafka基础学习(六):kafka 代码示例

    kafka 代码示例 生成者API在不同版本间无较大变动 消费者 Consumer 提供了两套API 低版本 8 0版本及其以前 API 高版本 8 0版本后 API 两种API的优缺点 高版本Consumer API 优点 高级API写起
  • Qt-UI 界面工具库简介

    一 关于Qt UI界面工具库 Qt UI界面工具库是武汉维仕杰科技有限公司基于Qt上进行扩展开发的控件包和界面工具 并且拥有完全自主的知识产权 得益于丰富的界面开发经验和强大的支持团队 使得Qt UI界面开发工具成为最专业 功能强大的Qt开
  • 他在 B 站有 178 万粉丝,今天免费带你玩转 Python

    近几年 编程越来越火 网上也是铺天盖地的免费教程 中小学生都开始投入到学习中 编程学习从娃娃抓起 甚至有些小学生都做起了 UP 主 教大家学编程 光从编程的难易度来说 Python 简单 易学 零基础 跨专业都很容易上手 想学全网超详细 P
  • Linux内核配置选项详解

    对于每一个配置选项 用户可以回答 y m 或 n 其中 y 表示将相应特性的支持或设备驱动程序编译进内核 m 表示将相应特性的支持或设备驱动程序编译成可加载模块 在需要时 可由系统或用户自行加入到内核中去 n 表示内核不提供相应特性或驱动程
  • Qt连接SQL server数据库

    Qt连接SQL server数据库 由于课程设计需要 需要用qt设计一个界面来操作数据库 在建立数据库连接时 期间遇到各种问题 Qt 连接SQL server数据大致可以概括为下图的三层模型 箭头代表他们之间的依赖关系 第一步 建立目标数据
  • FeignClient的参数传递给服务提供方的方式(简单数据类型、对象)

    1 简单数据类型的参数采用的restFull的方式 发送Get请求 服务提供方的controller 类名加了窄化请求 RequestMapping path house produces application json charset
  • 前端制作简单的“注册页面——阅读协议”页面及效果

    注 如对文中的scrollHeight scrollTop clientHeight属性有所一伙 请参考博文 JavaScript中元素client offset scroll相关属性的应用 链接 https blog csdn net m
  • 开源进展

    作为一个友好的 功能丰富的区块链中间件平台 WeBASE一直致力于降低区块链开发者的研发门槛 提高区块链开发效率 如今 WeBASE v1 5 4来了 此次更新新增区块链应用实训课程案例集 以及管理台操作指引与设计说明 助力社区开发者更快捷
  • 自定义指令 v-clickoutside 使用方法

    引入 import Clickoutside from element ui src utils clickoutside 声明 export default directives Clickoutside data function re
  • CentOS 安装Vim 编辑器

    在CentOS环境下使用vim提示 vim command not found时 说明系统还没有安装vim 安装步骤 1 检查是否已安装 查看一下你本机已经存在的包 确认一下你的VIM是否已经安装 输入 rpm qa grep vim 如果
  • 【详解】Thymeleaf中的基本表达式:@{},#{},${},*{}

    1 thymeleaf中的超链接表达式 话说例子如下 a a a a 2 thymeleaf中的消息表达式 或者是资源表达式 一般和 th text一起使用多一点 取出来的值取代了标签中的值 key 对应的value 如果标签中间已经有值
  • STM32的I2C主从机通信

    最近一段时间在做I2C通信协议 需要在两块STM32之间做I2C通信 定的是主机用IO口模拟 从机用的是STM32的硬件I2C 我的项目要求是需要主从机之间能够进行一串数据收发而不出错 实验时在主机方面 利用IO口模拟主机 只需要理解时序就
  • Java IDEA辅助键和快捷键

    快速生成main方法 psvm 回车 快速生成输出语句 sout 回车 内容辅助键 Ctrl Alt space 内容提示 代码补全等 格式化 Ctrl Alt L
  • java nio 编程

    转自 http yangguangfu iteye com blog 774194 Java代码 晚上学习了下Java 的 NIO Socket编程 写了下面这个小程序 包括服务器端与客户端 实现的功能为客户端向服务器端发送随即数目的消息
  • Java Executors(线程池)

    Sun在Java5中 对Java线程的类库做了大量的扩展 其中线程池就是Java5的新特征之一 除了线程池之外 还有很多多线程相关的内容 为多线程的编程带来了极大便利 为了编写高效稳定可靠的多线程程序 线程部分的新增内容显得尤为重要 有关J
  • PHP学习记录--基础篇

    目录 一 变量定义 二 循环结构 三 函数 四 文件加载原理 五 错误处理 六 字符串 七 数组 一 变量定义