php将数组写入到文件的三种方法

php将数组原样写入或保存到文件有三种方法可以实现,

第一种方法是使用serialize,

第二种方法是使用print_r,

第三种方法是使用var_export,

本文章向大家介绍这三种方法是如何将数组写入到文件的,需要的朋友可以参考一下。

第一:serialize方法

使用 serialize 将数组序列化,存储在文件中;调用时,再使用 unserialize 还原。

<?php 
$file='./cache/phone.php'; 
$array=array('color'=> array('blue','red','green'),'size'=> array('small','medium','large')); 
//缓存 
if(false!==fopen($file,'w+')){ 
  file_put_contents($file,serialize($array));//写入缓存 
} 
//读出缓存 
$handle=fopen($file,'r'); 
$cacheArray=unserialize(fread($handle,filesize($file)));

第二:print_r方法

用print_r 将数组打印到txt文件中。

<?php
$b = array (
    'm' => 'monkey', 
    'foo' => 'bar', 
    'x' => array ('x', 'y', 'z'));

$results = print_r($b, true); 
file_put_contents('filename.txt', print_r($b, true));
?>

第三:var_export方法

用var_export 直接将数组以完整数组的形式存储到文件中。

<?php 
$file='./cache/phone.php'; 
$array=array('color'=> array('blue','red','green'),'size'=> array('small','medium','large')); 
//缓存 
$text='<?php $rows='.var_export($array,true).';'; 
if(false!==fopen($file,'w+')){ 
  file_put_contents($file,$text); 
}else{ 
  echo '创建失败'; 
}

 


关注公众号,了解更多it技术(it问答网

opencart3前台分页类的使用思路

//获得文章个数。
			$product_total=$this->model_catalog_information2category->getTotalInformations("where category_id in (".$category_id.")");//1,2,3,4,5格式,方便后期扩展
			//echo $product_total;

			
//获得当前多少页
			if (isset($this->request->get['page'])) {
				$page = (int)$this->request->get['page'];
			} else {
				$page = 1;
			}
//定义一页显示记录数
			$limit=2;
//拼装url其他参数,比如文章的分类,这些是分页和搜索的条件。
			$url = '';
			if (isset($this->request->get['category_id'])) {
				$url .= '&category_id=' . $this->request->get['category_id'];
			}
//实例化分页类
			//测试分页
			$pagination = new Pagination();
			$pagination->total = $product_total;
			$pagination->page = $page;
			$pagination->limit = $limit;
			$pagination->url = $this->url->link('information2/category', 'path=' . $this->request->get['path'] . $url . '&page={page}');
//这个是在视图中调用的,直接输出分页样式和对应的分页链接。
			$data['pagination'] = $pagination->render();

			$data['results'] = sprintf($this->language->get('text_pagination'), ($product_total) ? (($page - 1) * $limit) + 1 : 0, ((($page - 1) * $limit) > ($product_total - $limit)) ? $product_total : ((($page - 1) * $limit) + $limit), $product_total, ceil($product_total / $limit));

//内容还是要输出显示的。	
			$start=($page-1)*$limit;
			//得到文章列表
			$arrlist=$this->model_catalog_information2category->getInformations(array("start"=>$start,"limit"=>$limit)," and i.category_id=".$category_id);
			//print_r($arrlist);
			$data['arrlist']=$arrlist;
//渲染模板
			$this->response->setOutput($this->load->view('information2/category', $data));

视图中:分页使用格式参考:

{% for v in arrlist %}
{{v.title}}<br/>
{% endfor %}
{{pagination}}{{results}}


关注公众号,了解更多it技术(it问答网

字符串去重和数组去重

字符串去重:

<?php  
/* 
字符串去重 
*/  
/*方法一,使用内置函数*/  
//公共函数:字符串去重函数  
$str = '1,2,3,3,3,5,4,4,5,4,7,6,,4,5';  
  
function unique($str){  
    //字符串中,需要去重的数据是以数字和“,”号连接的字符串,如$str,explode()是用逗号为分割,变成一个新的数组,见打印  
    $arr = explode(',', $str);  
    $arr = array_unique($arr);//内置数组去重算法  
    $data = implode(',', $arr);  
    $data = trim($data,',');//trim — 去除字符串首尾处的空白字符(或者其他字符),假如不使用,后面会多个逗号  
    return $data;//返回值,返回到函数外部  
}  
echo unique($str);  
?>  

方法一中使用内置函数,可以很方便的得到预期的效果, 打印出来的结果如下:1,2,3,5,4,7,6

<?php  
/*方法二,用foreach循环遍历也可以*/  
//公共函数:字符串去重函数  
$str = '1,2,3,3,3,5,4,4,5,4,7,6,,4,5';  
  
function unique($str){  
    $arr = explode(',', $str);  
    $arr = array_unique($arr);  
    $data = '';  
    //使用foreach循环拼接也可以得到,得到的效果是一样的  
    foreach ($arr as $key => $value) {  
        $data .= $value.',';//拼接关键代码</span></strong>  
    }  
    $data = trim($data,',');  
    return $data;  
}  
echo unique($str);  
?> 

两者得到的结果是一样的,当然,使用php内置函数会更高效,但是方法二中,字符串的拼接思想还是值得学习的。

数组去重

使用PHP的array_unique()函数允许你传递一个数组,然后移除重复的值,返回一个拥有唯一值的数组。

但是,如果你尝试在一个大的数组里使用array_unique()函数,它会运行地慢一些。点这里查看PHP 快速实现数组去重解决方案

总结:字符串去重和数组去重,面试中经常会问到!共同的核心函数就是:array_unique()


关注公众号,了解更多it技术(it问答网

支付宝无法异步通知及异步通知常见问题注意事项

支付宝异步通知参数(notify_url)路径常见问题注意事项:

1、不能是内网或者局域网地址,必须是外网可以访问的。否则无法调用!!

2、地址不能有session拦截,支付宝主动发送,所有session会失效;cookies、session等在此页面会失效!!这个一定要注意!!!!

3、必须保证服务器异步通知页面(notify_url)上无任何字符,如空格、HTML标签、开发系统自带抛出的异常提示信息等;

4、程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。
在25小时内完成6~10次通知(通知频率:5s,2m,10m,15m,1h,2h,6h,15h);
5、 程序执行完成后,该页面不能执行页面跳转。如果执行页面跳转,支付宝会收不到success字符,会被支付宝服务器判定为该页面程序运行出现异常,而重发处理结果通知;


关注公众号,了解更多it技术(it问答网

支付宝异步通知返回时cookie、session为什么会失效?

当商户网站中有设置服务器异步通知页面文件(参数notify_url对应页面文件)与同步跳转返回页面文件(参数return_url对应页面文件),且在这两个文件里编写了获取cookie、session的代码。此时就会出现问题。

同步跳转返回页面文件(参数return_url对应页面文件)是买家付款完成后,当前页面从支付宝的网站自动跳转返回到商户网站的指定网页。cookie、session是从用户的客户端里获取的,此时,同步跳转返回页面是在用户的客户端里执行。因此,cookie、session不会失效。

但是,服务器异步通知页面文件(参数notify_url对应页面文件)是交易状态发生变更时,支付宝主动通知到商户网站的指定网页。cookie、session是从用户的客户端里获取,此时,交互过程是服务器与服务器间的交互,那么获取的位置则不个人用户的客户端,而是服务器里。因此,商户网站无法获取到cookie、session的信息。


关注公众号,了解更多it技术(it问答网

tp5支付宝支付调试-徐多蔚项目亲测

一、从支付宝官方下载php版本的支付宝接口,后复制官方文件并修改。

将官方的源码解压到根目录下的extend里 更改名称,将 alipay.trade.page.pay-PHP-UTF-8 更改为 AlipayTradePagePay。

二、修改文件【可忽略】

注:windows下需要修改一个文件,但Linux系统是不需要修改的!

window 系统下需要修改

C:\tp5_alipay2017\extend\AlipayTradePagePay\lotusphp_runtime\Lotus.php 第 61行注释掉;

//trigger_error("invalid [default store dir]: " . $this->defaultStoreDir);

否则会报错 《错误一:[1024]invalid [default store dir]: /tmp/》 !

注释完了再改回来就没事儿了!!

就这么简单?是的:就这么简单!!!!!

三、新建alipay.php,并将下边代码复制进去,放到 application/extra 目录下,

// 支付宝配置文件
return [

        //应用ID,您的APPID。
        'app_id' => "2017091408724714",

        //商户私钥
        'merchant_private_key' => "MIIEowIBAAKCAQEAzuqhx1DejGM6iPyDpAPS09f7E8SlQLMHpH0LxkMeiLfXf471M1N163tUjwAamimE+BDhGRic6T9J05ddY8liQstKEDkUP5ttFlW7yPZSW0PGeb+0fsoAVoUQKDySRM1jkrwPaf4h5AxfsxXCZ+AZ1J3IlLL2a9Z1REmCCfeh2kFCGiCbzowbFIP00XFXzm/hyVa5XFFdg2LHtkMiQhcQd41920LAg16CyainOTA3/DhQjeYTVjWm3mqJS+l7EpCuq+1kIb1AR4CyZHvgYL8OERG9P+s7D60abTHwoGKnsAlh6mOsQnVy5j1TfebsImI20lYElN3LmcRIQ9tV9qwUowIDAQABAoIBAH6bCkoOrV1xCcvv1gxxWnrM2JAL7qFb6f03lhDF2NUGyBEAw/+XvbtMRz0Ibz6M0ROIIHNeoAQH+YBCSZ5ZBoqgIL00b7NLwr+7zZ71OQcmvTaZmjNKHlLSMESua0E1+ws5jqToHoyPFa9aTQ2KDcQOl0CFEEqDelVCNRMsNhh4Y/X5bhR6hnQl75c0sbUlcLTqnHfVTjHc3h2CGXMfiBVE2chbjVDOWmcinO50UVDjScs00iKwPE7MaEieRsqnbrMWtBdR7M2/JGR8zKQaXUd6oitpMERuu44DwdqmkwnnEvoZIWvN6NVvsUPCfdv182yLoDoxUJO+axqGep1dnmECgYEA53HPBGekQZSy9BOP11y/g6wnlNYnFfxcrRnlt++9y3oQLyvGPAG6OIk/f69aDP87Oye2foOEc/wMXpYKtM24w8Bmn1YRQlMXnoo22LUHc8p5s7KbgNXi6UK5yaAAGbdDicrXBw3TJulSSy8Pff14AiKshahUJyapbZeBbdxHe2UCgYEA5N6gEE2ylobCgAGz/Y89XdFsN2Ez+F7jEYfBf4jPonkUGry7LDM46mEduF9pvivEWcTh/nGWrFCaVfzYKhV1q+F0y+hCbLuRO3YpCP4uB9BpwVklKST79kze9jZKAOgvticU9d5M7OU+IqovmKVwh6mqyw+qYzk4iNlwHadGQ2cCgYEAkICYNjHXdjK3QHjuOBJqaHWWCPFkWe/ElTc0HBGNOHuvmyQDkvepIx9eDASZfr/kZVy4LmlCy3+04WFgsd4329BGwnjkMbrbZlr5P3hXfM4QCkgbmubv05+bi+1f4q5vdpq0gmz5RrQqc1Kgo5Mb2Il5mcGtOPyEkC4l20fLQZkCgYAAmcT5xfpuArSH+XkrdTDICkCqdIraYAVgimarmwRQfNjcqRokp43Cr7aQQU/Zu+usAKRHMq0ejqeZCizXD29boB/aWSWze1qKOWkqKOCeDKH6a+15CivPHayIIORY1EMryzZ23rp89K0REjlFwUlmUb+tAMGFuSS41zlAGqxIiQKBgEXu4NyecfEQ2LVZTCeTU2uGHVdLRnXms5hfQh8FFLl2hjJMlsP2Db3P+oRmh49SfUWSoKRI0s0fu1qwJ8JOolvaAP0JTGl8o63vyGzNI/i0qZflwO8BJNLBgsYMHtoKf5xkAazhfytwDSSTp3qWtXcp6Kw9XiEYjOi8jJAXX07L",

        //异步通知地址
        'notify_url' => "http://www.sxqibo.com/demo/alipay.trade.page.pay-PHP-UTF-8/notify_url.php",

        //同步跳转
        'return_url' => "http://www.sxqibo.com/demo/alipay.trade.page.pay-PHP-UTF-8/return_url.php",

        //编码格式
        'charset' => "UTF-8",

        //签名方式
        'sign_type'=>"RSA2",

        //支付宝网关
        'gatewayUrl' => "https://openapi.alipay.com/gateway.do",

        //支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
        'alipay_public_key' => "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhLaUQEpBDnaDfwxpVT3PyM+nkNVozOZvIrK+tGyH0y27EBFsDi/Lqb/Dp7iYJkywFRvITVl/CTF+G8Twz9MjGh/I4LjhaexZMHKXcRr3TfJJNE+ND2uWYN0zRwcUdMeVKd59aBDNBX3ubyDgXxTZeCIAGbfDzpqTwBfYnhmI10NJYgQKay1dCgheBZM9xY5CBaYeDhPAlnWk77DGLRlTXjlaYDKVNqwx8gnMK1Xezfl2g6wAF2cNIotq+kPnwJkEflMCGMvJAe8+Fgi2hNC0tzALgBpB3j6WGVh9H2lfHlI2AxKA8lIAh+bNJWsdOcPvEsC/+xoCn3jMyGi3BuSMgwIDAQAB",

];

在对应的控制器中,创建方法如下:

class Alipay{

    public function index()
    {
        dump(config());exit;
    }
}

确保我们根据url能访问到当前方法,若在输出的内容中,能够搜索到alipay,则说明我们创建的alipay配置文件无误。

调用支付宝配置 config('alipay');

四、关键函数文件

位置:application/index/common.php

关键性函数文件:

<?php
// +----------------------------------------------------------------------
// | NewThink [ Think More,Think Better! ]
// +----------------------------------------------------------------------

//生成唯一订单号
function build_order_no(){
    return date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}
/**
 * 支付宝 电脑网站支付
 * @auhor hongweizhiyuan
 * @param $out_trade_no     商户订单号
 * @param $subject          订单名称
 * @param $total_amount     订单金额
 * @param $body             商品描述
 * @example alipayPagepay('201791711599526','商品标题','0.01','商品描述');
 */
function alipayPagepay($out_trade_no,$subject,$total_amount,$body)
{

    //step1:获取配置
    import('AlipayTradePagePay.pagepay.service.AlipayTradeService',EXTEND_PATH,'.php');// 加载交易服务类
    $config=config('alipay');
    $aop=new AlipayTradeService($config);

    //step2:加载表单,构造参数
    import('AlipayTradePagePay.pagepay.buildermodel.AlipayTradePagePayContentBuilder',EXTEND_PATH,'.php');  // 支付宝电脑网站支付
    $payRequestBuilder = new AlipayTradePagePayContentBuilder();
    $payRequestBuilder->setBody($body);
    $payRequestBuilder->setSubject($subject);
    $payRequestBuilder->setTotalAmount($total_amount);
    $payRequestBuilder->setOutTradeNo($out_trade_no);

    //step3:创建支付
    $response = $aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']);

    //输出表单
    var_dump($response);

}




/**
 * 支付宝 电脑网站 交易查询
 * @param $WIDTQout_trade_no     商户订单号,商户网站订单系统中唯一订单号(请二选一设置)
 * @param $WIDTQtrade_no         支付宝交易号(请二选一设置)
 */
function alipayQuery($WIDTQout_trade_no,$WIDTQtrade_no)
{
    //step1:获取配置
    import('AlipayTradePagePay.pagepay.service.AlipayTradeService',EXTEND_PATH,'.php');// 加载交易服务类
    $config=config('alipay');
    $aop = new AlipayTradeService($config);

    //step2:加载表单,构造参数
    import('AlipayTradePagePay.pagepay.buildermodel.AlipayTradeQueryContentBuilder',EXTEND_PATH,'.php');  // 支付宝电脑网站支付查询接口
    $RequestBuilder = new AlipayTradeQueryContentBuilder();
    $RequestBuilder->setOutTradeNo($WIDTQout_trade_no);
    $RequestBuilder->setTradeNo($WIDTQtrade_no);

    /**
     * alipay.trade.query (统一收单线下交易查询)
     * @param $builder 业务参数,使用buildmodel中的对象生成。
     * @return $response 支付宝返回的信息
     */
    $response = $aop->Query($RequestBuilder);
    var_dump($response);
}

/**
 * 支付宝 电脑网站 退款
 * @param $out_trade_no     商户订单号,商户网站订单系统中唯一订单号(请二选一设置)
 * @param $trade_no         支付宝交易号(请二选一设置)
 * @param $refund_amount    需要退款的金额,该金额不能大于订单金额,必填
 * @param $refund_reason    退款的原因说明
 * @param $out_request_no   标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传
 */
function alipayRefund($out_trade_no,$trade_no,$refund_amount,$refund_reason,$out_request_no)
{
    //step1:获取配置
    import('AlipayTradePagePay.pagepay.service.AlipayTradeService',EXTEND_PATH,'.php');// 加载交易服务类
    $config=config('alipay');
    $aop = new AlipayTradeService($config);

    //step2:加载表单,构造参数
    import('AlipayTradePagePay.pagepay.buildermodel.AlipayTradeRefundContentBuilder',EXTEND_PATH,'.php');  // 支付宝电脑网站支付退款接口
    $RequestBuilder=new AlipayTradeRefundContentBuilder();
    $RequestBuilder->setOutTradeNo($out_trade_no);
    $RequestBuilder->setTradeNo($trade_no);
    $RequestBuilder->setRefundAmount($refund_amount);
    $RequestBuilder->setOutRequestNo($out_request_no);
    $RequestBuilder->setRefundReason($refund_reason);

    /**
     * alipay.trade.refund (统一收单交易退款接口)
     * @param $builder 业务参数,使用buildmodel中的对象生成。
     * @return $response 支付宝返回的信息
     */
    $response = $aop->Refund($RequestBuilder);
    var_dump($response);;
}

/**
 * 支付宝 电脑网站 退款查询
 * @param $out_trade_no         商户订单号,商户网站订单系统中唯一订单号(请二选一设置)
 * @param $trade_no             支付宝交易号(请二选一设置)
 * @param $out_request_no       请求退款接口时,传入的退款请求号,如果在退款请求时未传入,则该值为创建交易时的外部交易号,必填
 */
function alipayRefundQuery($out_trade_no,$trade_no,$out_request_no)
{
    //step1:获取配置
    import('AlipayTradePagePay.pagepay.service.AlipayTradeService',EXTEND_PATH,'.php');// 加载交易服务类
    $config=config('alipay');
    $aop = new AlipayTradeService($config);

    //step2:加载表单,构造参数
    import('AlipayTradePagePay.pagepay.buildermodel.AlipayTradeFastpayRefundQueryContentBuilder',EXTEND_PATH,'.php');  // 支付宝电脑网站 统一收单交易退款查询
    $RequestBuilder=new AlipayTradeFastpayRefundQueryContentBuilder();
    $RequestBuilder->setOutTradeNo($out_trade_no);
    $RequestBuilder->setTradeNo($trade_no);
    $RequestBuilder->setOutRequestNo($out_request_no);

    /**
     * 退款查询   alipay.trade.fastpay.refund.query (统一收单交易退款查询)
     * @param $builder 业务参数,使用buildmodel中的对象生成。
     * @return $response 支付宝返回的信息
     */
    $response = $aop->refundQuery($RequestBuilder);
    var_dump($response);
}

/**
 * 支付宝 电脑网站 交易关闭
 * @param $out_trade_no     商户订单号,商户网站订单系统中唯一订单号(请二选一设置)
 * @param $trade_no         支付宝交易号(请二选一设置)
 */
function alipayClose($out_trade_no,$trade_no)
{
    //step1:获取配置
    import('AlipayTradePagePay.pagepay.service.AlipayTradeService',EXTEND_PATH,'.php');// 加载交易服务类
    $config=C('ALIPAY_CONFIG');
    $aop = new AlipayTradeService($config);

    //step2:加载表单,构造参数
    import('AlipayTradePagePay.pagepay.buildermodel.AlipayTradeCloseContentBuilder',EXTEND_PATH,'.php');  // 支付宝电脑网站 统一收单交易关闭接口
    $RequestBuilder=new AlipayTradeCloseContentBuilder();
    $RequestBuilder->setOutTradeNo($out_trade_no);
    $RequestBuilder->setTradeNo($trade_no);

    /**
     * alipay.trade.close (统一收单交易关闭接口)
     * @param $builder 业务参数,使用buildmodel中的对象生成。
     * @return $response 支付宝返回的信息
     */
    $response = $aop->Close($RequestBuilder);
    var_dump($response);
}

 

 

https://www.kancloud.cn/hongweizhiyuan/thinkphp5-alipay/405842


关注公众号,了解更多it技术(it问答网

ci框架中隐藏index.php入口文件的方法-经典!徐老师亲测经验分享!

网上有很多资料介绍了ci(我当前ci版本[3.1.9])框架下隐藏index.php的方法,但是都不够实用,很多都需要结合修改服务器配置才可以实现!这就太麻烦了!不推荐!

下面我分享的是一个非常经典,有效,安全,可靠的一个方法,直接在ci站点根目录下创建一个.htaccess文件。在文件中输入如下内容:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteRule ^(.*)$ index.php?/$1 [L]   

</IfModule>

大功告成!xuduowei 徐多蔚 亲测无误!你在调试中遇到问题,欢迎随时联系我!


关注公众号,了解更多it技术(it问答网

php6及以上版本中微信接口开发$GLOBALS[“HTTP_RAW_POST_DATA”]需要always_populate_raw_post_data=on,这个方法不推荐使用

微信接口开发中的 $GLOBALS[“HTTP_RAW_POST_DATA”],针对php6及以上服务器环境,php.ini中always_populate_raw_post_data默认配置是-1,但是微信接口文件中[$GLOBALS[“HTTP_RAW_POST_DATA”]]需要设置为on。所以默认情况下,接口开发接口信息是有问题的。

有2种解决方法:

1、直接修改php.ini中

always_populate_raw_post_data=on 后重启服务器,这个能解决微信开发问题,但是若我们服务器上有其他项目如:tp3中自动开启session的,就会报错!就会出现类似如下的错误:

session_start(): Cannot send session cache limiter - headers already sent

总结:修改php.ini   always_populate_raw_post_data = On会影响到其他项目;

 

2、不修改服务器配置的前提下,直接修改接口文件用 file_get_contents(“php://input”)  代替$GLOBALS[“HTTP_RAW_POST_DATA”] 即可完美解决。xuduowei 亲测无误!推荐使用!

 


关注公众号,了解更多it技术(it问答网

php oop开发中, static::$var 的用法

static::$var 会强制使用当前调用对象所属类中的变量 $var 的值。表现条件:类的继承。

案例一:

class a{
   static protected $test="class a";
   public function static_test(){
     echo static::$test; //class b
     echo self::$test;   //class a
   }
}
class b extends a{
   static protected $test="class b";
}
 
$obj = new b();
$obj->static_test();

案例二:

class par{
    const v='A';
    public function f1()
    {
        echo static::v;//静态绑定static::
    }
    public function f2()
    {
        echo self::v;
    }
}
class child extends par{
    const v='B';
}
$b=new child();
$b->f1();  //result: 'B'
echo '<br>';
$b->f2();  //result: 'A'

 


关注公众号,了解更多it技术(it问答网