PHP数组和Json之间的转换详解

 更新时间:2016年11月25日 15:03  点击:1955
在php中数组与json转换很简单,我们只要使用json_encode() 和 json_decode()。很容易理解,json_encode()就是将PHP数组转换成Json。相反,json_decode()就是将Json转换成PHP数组。

例如:

 代码如下 复制代码

$array = array("name" => "Eric","age" => 23);
 
echo json_encode($array);

程序将打印出 :

 {“name”:”Eric”,”age”:23}

再看下面的例子:

 代码如下 复制代码

$array = array(0 => "Eric", 1 => 23);
 
echo json_encode($array);

程序将打印出 :

["Eric",23]

这样就可以将 json 转换成数组形式了,key 保持原来格式 

 代码如下 复制代码

$json = ’{"name":"zhangsan","age":20,"sex":"nan"}’; 

print_r(json_decode($json,true)); 

这样的json数据解析后 就会成为下面这样的数组 


Array 

    [name] => zhangsan 
    [age] => 20 
    [sex] => nan 
)

留言板可以说是所有php入门者都会练习的一个小不上的WEB应用程序了,下面我把我写的一个php留言板实例分享给各位同学,有需要了解的同学可进入参考参考。

1.在你的PHP的根目录下创建一个名为”msgboard”的文件夹。

在”msgboard”下创建一个“msglist.php”文件


数据表结构大家可直接导入

 

 代码如下 复制代码
CREATE TABLE `msgboard` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) CHARACTER SET latin1 NOT NULL,
  `sex` tinyint(1) NOT NULL DEFAULT '1',
  `msg` text CHARACTER SET latin1 NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


msglist.php 文件,包括了留言增加,删除,修改

 

 代码如下 复制代码

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>我的留言板</title>
</head>
<body>
<?php
 $username = isset($_REQUEST['username']) ? $_REQUEST['username'] : '';   //姓名
 $sex = isset($_REQUEST['sex']) ? intval($_REQUEST['sex']) : 1;                   //性别
 $msg = isset($_REQUEST['msg']) ? $_REQUEST['msg'] : '';                  //留言

 
 
 mysql_connect("127.0.0.1","root","lzy");       //链接
 mysql_select_db("test");                       //选择数据库
 
 if(!empty($username) && !empty($msg))
 {
  mysql_query("INSERT INTO msgboard(username,sex,msg) VALUES('$username','$sex','$msg')");
 }
 else
 {
  echo "输入不正确<br/>";
 }
 
 $source = mysql_query("SELECT * FROM msgboard ORDER BY id DESC");
 $result = array();
 
?>
 <table border="1" width="1000">
  <tr align="center">
   <td width="10%">姓名</td>
   <td width="10%">性别</td>
   <td width="80%">留言内容</td>
  </tr> 
  <tr>
  <?php
  while ($row = mysql_fetch_array($source))
  {
   echo '<td>' . $row['username'] . '</td>';
   echo '<td>' . ($row['sex'] == 1 ? '男' : '女') . '</td>';
   echo '<td>' . $row['msg'] . '</td>';
  }
  ?>
  </tr>
 </table><p/>
 
 <form action="msglist.php" method="POST">
 <table width="1000" align="left">
  <tr>
   <td width="100%">
    姓名:<input type="text" name="username" value=""/>
   </td>
  </tr>
  <tr>
   <td width="100%">
    性别:男<input type="radio" name="sex" value="1" checked="checked" /> &nbsp;&nbsp;
          女<input type="radio" name="sex" value="0" />
   </td>
  </tr>
  <tr>
   <td width="100%">
    请留言:<br/><textarea name="msg" rows="5" cols="100"></textarea>
   </td>
  </tr> 
  <tr>
   <td width="100%">
     <input type="submit" value="提 交" />
   </td>
  </tr> 
 </table>
 </form>
</body>
</html>

一个php留言板实例下载:http://file.111cn.net/download/2013/06/08/msgboard.rar

PHP出现文件锁与mysql表锁有大概想的用法,就是同一时间只能让一个人操作,这样就避免了同时有多个人操作同一文件,这样导致数据丢失的情况了,下面我来给大家介绍PHP文件锁用法。

PHP自带了文件锁函数:
bool flock ( int $handle , int $operation [, int &$wouldblock ] )
$handle 是打开的文件指针;
$operation 可以是
“LOCK_SH”,共享锁定;“LOCK_EX”,独占锁定;“LOCK_UN”,释放锁定;“LOCK_NB”,防止flock锁定时堵塞。
这里主要说说“LOCK_EX”和“LOCK_NB”。

比如我们有两个文件,如下。


flocka.php

 代码如下 复制代码

$file = 'temp.txt';
    $fp = fopen($file,'a');
 
    for($i = 0;$i < 5;$i++)
    {
        fwrite($fp, "11111111n");
        sleep(1);
    }
 
    fclose($fp);

flockb.php

 代码如下 复制代码
$file = 'temp.txt';
    $fp = fopen($file,'a');
 
    for($i = 0;$i < 5;$i++)
    {
        fwrite($fp, "22222222n");
    }
 
    fclose($fp);

先运行flocka.php,然后马上运行flockb.php。
结果:
11111111
22222222
22222222
22222222
22222222
22222222
11111111
11111111
11111111
11111111
说明不加文件锁时,两个文件会同时对txt文件进行写入操作。
下面修改一下两个php文件的代码。
flocka.php

 代码如下 复制代码
$file = 'temp.txt';
    $fp = fopen($file,'a');
 
    if(flock($fp,LOCK_EX))
    {
        for($i = 0;$i < 5;$i++)
        {
            fwrite($fp, "11111111n");
            sleep(1);
        }
        flock($fp,LOCK_UN);
    }
    fclose($fp);

flockb.php

 代码如下 复制代码
$file = 'temp.txt';
    $fp = fopen($file,'a');
 
    if(flock($fp,LOCK_EX))
    {
        for($i = 0;$i < 5;$i++)
        {
            fwrite($fp, "22222222n");
        }
         flock($fp,LOCK_UN);
    }
 
    fclose($fp);

同样先运行flocka.php,然后马上运行flockb.php。
会发现在flocka.php运行结束前,flockb.php一直处于等待状态,只有当flocka.php运行结束后,flockb.php才会继续执行。
输出结果:
11111111
11111111
11111111
11111111
11111111
22222222
22222222
22222222
22222222
22222222
另外,在执行flock时,文件锁会自动释放。


还有一种办法


如下代码简单模拟了这种事务并发状态: process1.php

 代码如下 复制代码
 <?php
    $num = 100;
    $filename = "processdata.txt";
 
    $fp = fopen($filename, "a");
    for ($i = 0; $i < $num; $i++) {
        fwrite($fp, "process1: " . $i . "rn");
        usleep(100000);
    }
    fclose($fp);
    ?>

我们需要先执行第一个事务,在processdata.txt文件中写入这100行。

process2.php

 代码如下 复制代码

 <?php
    $num = 100;
    $filename = "processdata.txt";
 
    $fp = fopen($filename, "a");
    for ($i = 0; $i < $num; $i++) {
        fwrite($fp, "process2: " . $i . "rn");
        usleep(100000);
    }
    fclose($fp);
    ?>

第二个事务,继续向processdata.txt文件中写入100行。

第二个事务,继续向processdata.txt文件中写入100行。

多次同时执行,虽然都写了100行,但是事务1和事务2的数据交错写入,这并不是我们想要的结果。我们要的是事务完整的执行,此时我们需要有个机制去保证在第一个事务执行完后再执行第二个。在PHP中,flock函数完成了这一使命。在事物1和事务2的循环前面都加上: flock($fp, LOCK_EX); 就能满足我们的需求,将两个事务串行。

当某一个事务执行完flock时,因为我们在这里添加的是LOCK_EX(独占锁定),所以所有对资源的操作都会被阻塞,只有当事务执行完成后,后面的事务才会执行。我们可以通过输出当前的时间的方法来确认这一点。

关于在尾部追加写入,在unix系统的早期版本中存在一个并发写入的问题,如果要在尾部追加,需要先lseek位置,再write。当多个进程同时操作时,会因为并发导致的覆盖写入的问题,即两个进程同时获取尾部的偏移后,先后执行write操作,后面的操作会将前面的操作覆盖。这个问题在后面以添加打开时的O_APPEND操作而得到解决,它将查找和写入操作变成了一个原子操作。

在PHP的fopen函数的实现中,如果我们使用a参数在文件的尾部追加内容,其调用open函数中oflag参数为 O_CREAT|O_APPEND,即我们使用追加操作不用担心并发追加写入的问题。

在PHP的session默认存储实现中也用到了flock文件锁,当session开始时就调用PS_READ_FUNC,且以O_CREAT | O_RDWR | O_BINARY 打开session数据文件,此时会调用flock加上写锁,如果此时有其它进程访问此文件(即同一用户再次发起对当前文件的请求),就会显示页面加载中,进程被阻塞了。加写锁其出发点是为了保证此次会话中对session的操作事务能完整的执行,防止其它进程的干扰,保证数据的一致性。如果一个页面没有session修改操作,可以尽早的调用session_write_close()释放锁。

文件锁是针对文件的锁,除了这种释义,还可以理解为用文件作为锁。在实际工作中,有时为确保单个进程的执行,我们会在程序执行前判断文件是否存在,如果不存在则创建一个空文件,在进程结束后删除这个空文件,如果存在,则不执行。

在php中表单提交数据有几种,一种是post和get方式,下面我来给各位php初学者详细介绍利用get,post来接收表单提交数据实例用法,有需要了解的朋友可参考。

PHP $_GET 和 $_POST变量是用来获取表单中的信息的,比如用户输入的信息

PHP4.1(好像)以后取消了直接接收变量,而用 $_GET['变量名'] 接收从链接传递过来的变量, 用 $_POST['变量名'] 接收从表单提交来的变量。同样有$_FILES[],$_SERVER[]等


下面是一个 HTML 文件,这个 HTML 含有一个 HTML 表单 (HTML Form),主要用来让用户输入用户姓名的。

 代码如下 复制代码

<form action ="get.php" method ="get">Name:
<input type="text" name="username" />
<input type ="submit" value="ok" />
</form>

该 HTML 的显示界面如下:

当你在这个 HTML 文件的表单文本框输入框里输入姓名,比如 "Jacky",然后鼠标点击ok 按钮,会跳转到 get.php,在 get.php 里会显示如下图。

get.php 的源代码如下:

 

 代码如下 复制代码
<?php echo $_GET["username"]?>.

取表单控件的 name 值,可以获得该表单控件的数据。

比如 "username" 就是表单控件文本输入框的 name 值,

 代码如下 复制代码

<input type="text" name="username" />

用 $_GET["username"] 可以获得该文本输入框的数据。

 代码如下 复制代码
<?php echo $_GET["username"]?>

获取 HTML 表单 (HTML Form) 单选框 (input type="radio") 数据
取表单单选框的 name 值,可以获得表单单选框的值。

$_POST获取HTML表单提交数据

下面是一个 HTML 文件,这个 HTML 含有一个 HTML Form,主要用来让用户输入用户姓名的。

 

 代码如下 复制代码
<form action ="post.php" method ="post">
Name: <input type="text" name="username" />
<input type ="submit" value="ok" />
</form>

 

当你在这个 HTML Form 的文本框输入框里输入姓名,比如 "Jacky",然后鼠标点击ok 按钮,会跳转到 post.php,显示的输出结果是You are Jacky.。post.php 的源代码如下:

 代码如下 复制代码

You are <?php echo $_POST["username"]?>.

 
取表单控件的 name 值,可以获得该表单控件的数据。

比如 "username" 就是表单控件文本输入框的 name 值,

 代码如下 复制代码

<input type="text" name="username" /> 

用 $_POST["username"] 可以获得该文本输入框的数据。

 代码如下 复制代码

<?php echo $_POST["username"]?> 

$_REQUEST变量

PHP $_REQUEST变量包含$_GET, $_POST, and $_COOKIE的内容

PHP $_REQUEST变量可以用来获取通过“GET”和“POST”这两种方法发送的表单数据。

案例

 代码如下 复制代码

Welcome <?php echo $_REQUEST["name"]; ?>.<br />
You are <?php echo $_REQUEST["age"]; ?> years old

三元运算符,是软件编程中的一个固定格式,即( ?: )(注:括号里面的内容才是正确的格式)。

语法:条件 ? 结果1 : 结果2

说明:问号前面的位置是判断的条件,如果满足条件时结果1,不满足时结果2。

 

 代码如下 复制代码

<?PHP

$id = isset($_GET['id']) ? $_GET['id'] : false;

?>

一条代码替代了很多的代码。首先,它使用isset ()函数,检查$_GET['id']是否存在。如果$_GET['id']确实存在,它将返回它的价值。但是,如果它不存在,条件即为假,这时返回的是false。$id的值取决于$_GET['id']是否存在。所以,基本上,如果$_GET['id']存在,$id=$_GET['id'],反之$id=false。


用“?:”条件语句检验用户输入值:

 代码如下 复制代码

<?php
$filename = isset($argv[1]) ? $argv[1] : "php://stdin";
$fp = @fopen($filename, ‘r’) or die("Can’t Open $filename for reading");

while (!@feof($fp)) {
    $line = @fgets($fp, 1024);
    print $line;
}

@fclose($fp);
?>

前面使用三元运算符的代码和下面的代码等同:

 代码如下 复制代码

<?php
if (isset($argv[1])) {
    $filename = $argv[1];
} else {
    $filename = "php://stdin";
}
?>

可以看出,假设用普通的if-else结构写上述代码,代码量会比上面多出许多,但第二种形式更易理解,而且不要求更多的录入。所以在挑选三元运算符时,请务必权衡一下利弊。

三元运算符优点

PHP中的三元运算符(?:)大大减少了程序员写这些语句的时间。它的语法如下:

condition ? do_if_true : do_if_false;

三元运算符不是一种必不可少的结构,但却是一种美化代码的途径。同样,它可以取代不好的if…else代码块,并且可以提高代码的可读性。

同样,用户可以使用PHP的or运算服赋予变量默认值:

 代码如下 复制代码

<?php
$filename = $argv[1] or $filename = "php://stdin";
?>

[!--infotagslink--]

相关文章

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

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • 使用PHP+JavaScript将HTML页面转换为图片的实例分享

    这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19
  • Python 图片转数组,二进制互转操作

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

    这篇文章主要介绍了gin 获取post请求的json body操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-15
  • 在数据库里将毫秒转换成date格式的方法

    在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。 一、 在MySQL中,有内置的函数from_unixtime()来做相应的转换,使用如下: 复制...2014-05-31
  • 详解Mysql中的JSON系列操作函数

    新版 Mysql 中加入了对 JSON Document 的支持,可以创建 JSON 类型的字段,并有一套函数支持对JSON的查询、修改等操作,下面就实际体验一下...2016-08-23
  • Json格式详解

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成...2021-11-05
  • php数组操作 键名比较 差集 交集赋值

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

    这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 美图秀秀把普通照片快速转换成卡通效果教程

    今天小编在这里就来给美图秀秀的这一款软件的使用者们来说下把普通照片快速转换成卡通效果的教程,各位想知道具体制作步骤的使用者们,那么下面就快阿里跟着小编一起看一...2016-09-14
  • C#使用Http Post方式传递Json数据字符串调用Web Service

    这篇文章主要为大家详细介绍了C#使用Http Post方式传递Json数据字符串调用Web Service,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Javascript类型转换的规则实例解析

    这篇文章主要介绍了Javascript类型转换的规则实例解析,涉及到javascript类型转换相关知识,对本文感兴趣的朋友一起学习吧...2016-02-27
  • 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
  • js遍历json的key和value的实例

    下面小编就为大家带来一篇js遍历json的key和value的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2017-01-26
  • C#实现字符串转换成字节数组的简单实现方法

    这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
  • C# 拷贝数组的几种方法(总结)

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

    本文记录的要实现的功能类似于 MySQL 中的 ORDER BY,上个项目中有遇到这样的一个需求。 要求:从两个不同的表中获取各自的4条数据,然后整合(array_merge)成一个数组,再根据数据的创建时间降序排序取前4条。 遇到这个...2014-06-07
  • 详解.NET Core 3.0 里新的JSON API

    这篇文章主要介绍了详解.NET Core 3.0 里新的JSON API,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • c#将字节数组转成易读的字符串的实现

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