php数组转Json的例子

 更新时间:2016年11月25日 15:36  点击:1358
数组与Json格式其实是非常像了,我们可以利用相关的函数来进行相互转换的,下面来给各位整理一个从mysql读取数据之后再利用php函数转换成json回传,具体如下

数组转Json

<?php  

header("Content-Type: text/html; charset=utf-8");  

  

$mydb=mysql_connect("localhost","root","root");  

if (!$mydb){  

  die('Could not connect:'. mysql_error());  

}  

  

$db_selected=mysql_select_db("mysql",$mydb);  

//$sql = "SELECT * from Person WHERE Lastname='Adams'";  

$sql="SELECT * from user";  

$result=mysql_query($sql,$mydb);  

//print_r(mysql_fetch_array($result));  

  

  

//处理输出数组格式  

//$db1=mysql_query("select * from `tb_info`");  

/* 

$arr=array(); 

while($rows=mysql_fetch_array($db1)){ 

$key=$rows['id'] 

$arr[$key] = $rows['qucount'] 

} 

*/  

  

/************************************************************** 

 * 

 *  使用特定function对数组中所有元素做处理 

 *  @param  string  &$array     要处理的字符串 

 *  @param  string  $function   要执行的函数 

 *  @return boolean $apply_to_keys_also     是否也应用到key上 

 *  @access public 

 * 

 *************************************************************/  

function arrayRecursive(&$array, $function, $apply_to_keys_also = false)  

{  

    static $recursive_counter = 0;  

    if (++$recursive_counter > 1000) {  

        die('possible deep recursion attack');  

    }  

    foreach ($array as $key => $value) {  

        if (is_array($value)) {  

            arrayRecursive($array[$key], $function, $apply_to_keys_also);  

        } else {  

            $array[$key] = $function($value);  

        }  

     

        if ($apply_to_keys_also && is_string($key)) {  

            $new_key = $function($key);  

            if ($new_key != $key) {  

                $array[$new_key] = $array[$key];  

                unset($array[$key]);  

            }  

        }  

    }  

    $recursive_counter--;  

}  

     

/************************************************************** 

 * 

 *  将数组转换为JSON字符串(兼容中文) 

 *  @param  array   $array      要转换的数组 

 *  @return string      转换得到的json字符串 

 *  @access public 

 * 

 *************************************************************/  

function JSON($array) {  

    arrayRecursive($array, 'urlencode', true);  

    $json = json_encode($array);  

    return urldecode($json);  

}  

  

   

  

$array = array  

       (  

          'Name'=>'希亚',  

          'Age'=>20  

       );  

  

/* 

$array=array ( 

  0 =>  

  array ( 

    'icon' =>  

    array ( 

      'hasPhoto' => '0', 

      'photoPath' => '/resources/v20/images/boy.png', 

    ), 

    'age' => '24', 

    'name' => '男士', 

    'province' => '北京', 

    'lottery' => '100元的爱玛电动车代金券', 

    'mobile' => '', 

  ), 

  1 =>  

  array ( 

    'icon' =>  

    array ( 

      'hasPhoto' => '0', 

      'photoPath' => '/resources/v20/images/boy.png', 

    ), 

    'age' => '24', 

    'name' => '男士', 

    'province' => '北京', 

    'lottery' => '100元的爱玛电动车代金券', 

    'mobile' => '', 

  ), 

  2 =>  

  array ( 

    'icon' =>  

    array ( 

      'hasPhoto' => '0', 

      'photoPath' => '/resources/v20/images/boy.png', 

    ), 

    'age' => '25', 

    'name' => '男士', 

    'province' => '上海', 

    'lottery' => '100元的爱玛电动车代金券', 

    'mobile' => '', 

  ), 

  3 =>  

  array ( 

    'icon' =>  

    array ( 

      'hasPhoto' => '0', 

      'photoPath' => '/resources/v20/images/boy.png', 

    ), 

    'age' => '24', 

    'name' => '男士', 

    'province' => '北京', 

    'lottery' => '100元的爱玛电动车代金券', 

    'mobile' => '186****1046', 

  ), 

  4 =>  

  array ( 

    'icon' =>  

    array ( 

      'hasPhoto' => '0', 

      'photoPath' => '/resources/v20/images/boy.png', 

    ), 

    'age' => '24', 

    'name' => '男士', 

    'province' => '北京', 

    'lottery' => '200元的爱玛电动车代金券', 

    'mobile' => '186****1046', 

  ), 

  5 =>  

  array ( 

    'icon' =>  

    array ( 

      'hasPhoto' => '0', 

      'photoPath' => '/resources/v20/images/boy.png', 

    ), 

    'age' => '24', 

    'name' => '男士', 

    'province' => '北京', 

    'lottery' => '100元的爱玛电动车代金券', 

    'mobile' => '', 

  ), 

  6 =>  

  array ( 

    'icon' =>  

    array ( 

      'hasPhoto' => '0', 

      'photoPath' => '/resources/v20/images/boy.png', 

    ), 

    'age' => '24', 

    'name' => '男士', 

    'province' => '北京', 

    'lottery' => '100元的爱玛电动车代金券', 

    'mobile' => '', 

  ), 

  7 =>  

  array ( 

    'icon' =>  

    array ( 

      'hasPhoto' => '0', 

      'photoPath' => '/resources/v20/images/boy.png', 

    ), 

    'age' => '24', 

    'name' => '男士', 

    'province' => '北京', 

    'lottery' => '100元的爱玛电动车代金券', 

    'mobile' => '', 

  ), 

  8 =>  

  array ( 

    'icon' =>  

    array ( 

      'hasPhoto' => '0', 

      'photoPath' => '/resources/v20/images/boy.png', 

    ), 

    'age' => '24', 

    'name' => '男士', 

    'province' => '河南', 

    'lottery' => '100元的爱玛电动车代金券', 

    'mobile' => '', 

  ), 

  9 =>  

  array ( 

    'icon' =>  

    array ( 

      'hasPhoto' => '0', 

      'photoPath' => '/resources/v20/images/boy.png', 

    ), 

    'age' => '24', 

    'name' => '男士', 

    'province' => '北京', 

    'lottery' => '100元的爱玛电动车代金券', 

    'mobile' => '', 

  ), 

  10 =>  

  array ( 

    'icon' =>  

    array ( 

      'hasPhoto' => '1', 

      'photoPath' => '/201412/11/11/49/1418269782350A03EA57_c.jpg', 

    ), 

    'age' => '20', 

    'name' => '白日做梦', 

    'province' => '北京', 

    'lottery' => '100元的爱玛电动车代金券', 

    'mobile' => '', 

  ), 

); 

*/  

  

    

echo JSON($array);  

?>

json对象转成

 

普通数组 也就是 Array 的最简单方法还是 用 json_decode() 方法,只需要在后面多写一个参数就可以搞定

json_decode($json,true);

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

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

print_r(json_decode($json,true));

这样的json数据解析后 就会成为下面这样的数组
Array
(
    [name] => zhangsan
    [age] => 20
    [sex] => nan
)

数组转json 中文字符

<?php
$josin=array(
     '0'=>array(
            'name'=>'四海一家',
            'subname'=>'南阳店',
            'agv'=>'5',
            'add'=>'新街口地铁站E24号',
            'tel'=>'13382041088',
      ),
      '1'=>array(
            'name'=>'四海二家',
            'subname'=>'南阳店',
            'agv'=>'5',
            'add'=>'新街口地铁站E24号',
            'tel'=>'13382041088',
      ),
           '2'=>array(
            'name'=>'四海三家',
            'subname'=>'南阳店',
            'agv'=>'5',
            'add'=>'新街口地铁站E24号',
            'tel'=>'13382041088',
      ),
           '3'=>array(
            'name'=>'四海四家',
            'subname'=>'南阳店',
            'agv'=>'5',
            'add'=>'新街口地铁站E24号',
            'tel'=>'13382041088',
      ),
           '4'=>array(
            'name'=>'四海五家',
            'subname'=>'南阳店',
            'agv'=>'5',
            'add'=>'新街口地铁站E24号',
            'tel'=>'13382041088',
      ),
  
);
$k=JSON($josin);
echo $k;
 
    /**************************************************************
     *
     *  使用特定function对数组中所有元素做处理
     *  @param  string  &$array     要处理的字符串
     *  @param  string  $function   要执行的函数
     *  @return boolean $apply_to_keys_also     是否也应用到key上
     *  @access public
     *
     *************************************************************/
    function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
    {
        static $recursive_counter = 0;
        if (++$recursive_counter > 1000) {
            die('possible deep recursion attack');
        }
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                arrayRecursive($array[$key], $function, $apply_to_keys_also);
            } else {
                $array[$key] = $function($value);
            }
       
            if ($apply_to_keys_also && is_string($key)) {
                $new_key = $function($key);
                if ($new_key != $key) {
                    $array[$new_key] = $array[$key];
                    unset($array[$key]);
                }
            }
        }
        $recursive_counter--;
    }
       
    /**************************************************************
     *
     *  将数组转换为JSON字符串(兼容中文)
     *  @param  array   $array      要转换的数组
     *  @return string      转换得到的json字符串
     *  @access public
     *
     *************************************************************/
    function JSON($array) {
        arrayRecursive($array, 'urlencode', true);
        $json = json_encode($array);
        return urldecode($json);
    }

文件上传中有一块非常重要的就是安全验证了,如果验证不合理就很容易给一些人把此利用上传非常的黑客文件了,那么对于新学php新手文件上传验证有多了解呢?如果不懂可以看看本文章。

最近遇到一个事,把自己坑了好久,我想说说我开始的想法

PHP的上传机制封装的很完全,基本几行代码就能实现,他的实现流程是这样的

UPLOAD到文件到临时目录中?>使用move_uploadde_file()到指定的目录

这就是PHP上传流程,或者你在中途再进行一些验证。例如判断是不是通过upload方式提交的文档,或者文件的扩展是不是我们允许的

等等一系列验证。我给出简单的代码也算是抛砖引玉了。

$targetFolder = '/uploads'; // 定义根目录

if (!empty($_FILES)) {

    $tempFile = $_FILES['Filedata']['tmp_name'];

if(is_uploaded_file($tempFile))

{

    $targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;

    $targetFile = rtrim($targetPath,'/') . '/' . $_FILES['Filedata']['name'];

    $fileTypes = array('jpg','jpeg','gif','png'); // 允许的后缀扩展

    $fileParts = pathinfo($_FILES['Filedata']['name']);

    if (in_array($fileParts['extension'],$fileTypes)) {

        move_uploaded_file($tempFile,$targetFile);

        echo '1';

    } else {

        echo '非法上传文档.';

    }

}else

{

   echo "非法上传文件";

}

}

上面的这种方式基本就满足了文件上传。但我需要的不是这样的。

上传功能

 

 需求:先点击上传文档,然后选择上传文件,JS上传后会返回一个值,显示当前时间戳问名称的文件在文档名称这个框框中。

然后点击提交后,提交表单。

服务器处理提交的表单,对上传的文件进行重命名。

问题也随之而来了,服务器是IIS的,然后它是用的映射的方式实现的虚拟跟目录。

这样的话$_SERVER[‘DOCUMENT_ROOT’]就不在PHP站点的根目录

虽然完成了上传的功能,但无法下载这个文件。从服务器的安全考虑,还是打算把文件放在PHP站点内。

然后我就陷进了一个思维局限中。

再仔细想一想:

为何我不用实现PHP的上传机制的方式在重复一次。

PHP不是将文件先放到临时目录里面吗?然后我为嘛假设JS上传成功后的目录也是一个临时目录,

然后在再一次提交表单的时候进行文件复制。到指定的目录这样就完成了需要的功能。

PHP有一个文件复制函数Copy(); 然后在配合rename()函数。这样就可以完成上传后文件的第二次移动和重命名了。

注意:在window平台下如果复制一个零字节的文件,copy() 将返回 FALSE ,但文件也会被正确复制。

然后PHP在文件处理上,积极的参考了Liunx的文件处理机制。PHP的文件操作效率,这跟I/O对写和操作系统有关。

总结:其实解决问题的方式很多,而且不要给自己画圈从而限定自己的思维。

 

函数可以通过样相关函数找到位置这个问题小编还是第一次听过了,不过这个函数小编测试还真是有效了,下面来看这两段代码

破解什么代码的时候。用到这个代码就最好不过了。马上收藏起来。以后可以使用。下面说说使用这个 PHP获取指定函数定义在哪个文件中 函数的方法。这需要顺便定义一个function XX() 就OK了
使用方法
 

function a(){

}

function_dump('a');


 
然后就可以了 下面是核心代码
 

function function_dump($funcname) {

    try {

        if(is_array($funcname)) {

            $func = new ReflectionMethod($funcname[0], $funcname[1]);

            $funcname = $funcname[1];

        } else {

            $func = new ReflectionFunction($funcname);

        }

    }  (ReflectionException $e) {

        echo $e->getMessage();

        return;

    }

    $start = $func->getStartLine() - 1;

    $end =  $func->getEndLine() - 1;

    $filename = $func->getFileName();

    echo "function $funcname defined by $filename($start - $end)\n";

}

 

表单重复提交肯定不是 们所需要的了我们最多的办法就是直接使用php查询数据库进行处理了,今天我整理了不需要查询数据库就可以防止用户重复提交的三种方法

js 阻止重复提交


第一个是将告诉浏览器禁用submit按钮的表单被提交之后,第二个是将更改按钮的文本来给用户一些知道发生了什么。这是代码添加到你的表单标记:onsubmit="document.getElementById('myButton').disabled=true;document.getElementById('myButton').value='Submitting, please wait...';"你的表单标记将类似于: 

或jquery做法

$(document).ready(function(){
  $(input:submit).click(){
      setTimeout(function(){obj.disabled=true;},100)
  };
});

PHP程序员就是这样实现防止用户多表单提交的;这种方法应用于大多数的浏览器(IE  +,FireFox、Opera、…)。

Session阻止重复提交

由于表单变量的内容由$_POST[‘name’]引用,也许在处理完表单后,直接将$_POST[‘name’]销毁(unset())即可, 其实不然可能由于页面默认对表单内容进行了缓存,所以,即使销毁了$_POST[‘name’],刷新后,$_POST[‘name’]还是会被赋值,一 样有效。

可利用Session解决。首先给Session赋个值,比如400,第一次提交成功后改变Session的值,当第二次提交时去检查这个Session的值,如果不是400,就不再处理表单中的数据。 可设置Session的有效时间?

<?php
if (isset($_POST[‘action’]) && $_POST[‘action’] == ’submitted’) {
session_start();
isset($_SESSION[‘num’]) or die (“no session”);
if ($_SESSION[‘num’]==400){

echo ‘<a href=”‘.$_SERVER[PHP_SELF] .'”>Please try again</a>';
$_SESSION[‘num’]=500;
} else {

echo “However you have submitted”;
}
} else {
session_start() or die(“session is not started”);
$_SESSION[‘num’]= 400;
?>
<form action=”<?php echo $_SERVER[‘PHP_SELF’]; ?>” method=”POST”>
Name: <input type=”text” name=”personal[name]”><br>
Email: <input type=”text” name=”personal[email]”><br>
Beer: <br>
<select multiple name=”beer[]”>
<option value=”warthog”>Warthog</option>
<option value=”guinness”>Guinness</option>
<option value=”stuttgarter”>Stuttgarter Schwabenbr</option>
</select><br>
<input type=”hidden” name=”action” value=”submitted”>
<input type=”submit” name=”submit” value=”submit me!”>
</form>
<?php
}
?>

cookie阻止重复提交

引入cookie机制来解决(这个方法不建议用,原因后面会写到)

提交页面代码如下a.php代码如下:

<form id="form1" name="form1" method="post" action="b.php">
<p>说明
<input type="text" name="titile" />
</p>
<p>
<input type="submit" name="Submit" value="提交" />
</p>
</form>
<?php
setcookie("onlypost", 't');   //设置cookie,可以带上时间值。像有些论坛防止灌水就可以将你的一些基本信息存放到里面。
?>

处理页面b.php代码如下:

<?php
if($_COOKIE['onlypost'] == 't'){
printr($COOKIE);
//处理提交的内容  如果验证成功则处理
print "ok";
setcookie("onlypost", 'f'); //改变cooike值删除也可以了
}
?>

利用header函数跳转

一旦用户点击提交按钮,处理完数据后跳到其他页面

if (isset($_POST['submit'])) {
   header('location:success.php');//处理数据后,转向到其他页面
}

利用数据库来添加约束

直接在数据库里添加唯一约束或创建唯一索引,一旦发现用户重复提交了,直接抛出警告或者提示,
或者只处理第一次提交的数据,这是最直接有效的方法,要求前期的数据库设计和架构要考虑周全

我们知道浏览器因为考虑到安全问题一般情况下是不支持跨域提交form表单了,但有时我们工作又需要了,下面就来看看一篇跨域提交form表单例子。

远程出于安全因素考虑,直接跨域访问是不允许的,下面介绍二种跨域的方法。

一,通过php curl

function curlPost($url,$params) 

 $postData = ''; 
 foreach($params as $k => $v) 
 { 
 $postData .= $k . '='.$v.'&'; 
 } 
 rtrim($postData, '&'); 
 $ch = curl_init(); 
 curl_setopt($ch,CURLOPT_URL,$url); 
 curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); 
 
 curl_setopt($ch,CURLOPT_HEADER, false); 
 curl_setopt($ch, CURLOPT_POST, count($postData)); 
 curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);  
 
 $output=curl_exec($ch); 
 
 curl_close($ch); 
 return $output; 

 
echo curlPost("http://111cn.net",array('name'=>"tank")); 


以前很多人用curl来抓,邮箱的通讯录,不过现在已经不可以了。哈哈。

二,利用jquery form,ajax提交

1,下载jquery.form.js

2,js代码


$('#testform').submit(function() { 
 $(this).ajaxSubmit({ 
 type: 'post', // 提交方式 get/post 
 dataType:"json",//数据类型 
 url: 'your url', // 需要提交的 url 
 success: function(data) { // data 保存提交后返回的数据,一般为 json 数据 
 // 此处可对 data 作相关处理 
 alert('提交成功!'); 
 } 
 $(this).resetForm(); // 提交后重置表单 
 }); 
 return false; // 阻止表单自动提交事件 
}); 

3,php代码
 
header("Access-Control-Allow-Origin:*"); //跨域权限设置,允许所有 
 
header("Access-Control-Allow-Origin:http://www.111cn.net"); //只允许111cn.net跨域提交数据 

[!--infotagslink--]

相关文章

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

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python 图片转数组,二进制互转操作

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

    这篇文章主要介绍了gin 获取post请求的json body操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-15
  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • 详解Mysql中的JSON系列操作函数

    新版 Mysql 中加入了对 JSON Document 的支持,可以创建 JSON 类型的字段,并有一套函数支持对JSON的查询、修改等操作,下面就实际体验一下...2016-08-23
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • Json格式详解

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

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

    这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C#使用Http Post方式传递Json数据字符串调用Web Service

    这篇文章主要为大家详细介绍了C#使用Http Post方式传递Json数据字符串调用Web Service,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • 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
  • index.php怎么打开?如何打开index.php?

    index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
  • 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
  • C#读取文件所有行到数组的方法

    这篇文章主要介绍了C#读取文件所有行到数组的方法,涉及C#针对文件及数组的相关操作技巧,需要的朋友可以参考下...2020-06-25