作者归档:salmonl

关于salmonl

成长,长成自己的样子。微博@动机在北京,欢迎来玩~

PHP实现括号匹配检查

思考这样一个经典的问题,检查一个字符串中的括号(只有括号)是否匹配?

很多年前在面试的时候被问到这个问题,自己想到的是用正则来处理,具体实现的时候又无法兼容全部情况。

事后知道用栈就能很容易的处理。栈是一种特殊的线性表,只能在一端进行插入和删除操作,具有后进先出的特点。

实现算法:
0、遍历字符串,判断括号类型
1、如果是左括号,添加到数组中
2、如果是右括号,从数组中取出最后一个元素,没有元素或不匹配验证失败;匹配这删除元素,继续
3、遍历完后,检查数组是否为空,为空则验证成功,否则验证失败。
继续阅读

PHP保留固定位小数

这个是常用功能了,网上很多文章写的都不完整。特整理。

首先说明,round()函数并不能总是起作用, 故而不能实现本题的要求,比如:

# 不起作用
php -r "echo round(10000, 2), PHP_EOL;" // 10000
# 起作用
php -r "echo round(10000.256, 2), PHP_EOL;" // 10000.26

继续阅读

Hive和JSON_UNESCAPED_UNICODE

这篇记录是为了纪念自己的无知和自以为是。

给数据部门提供了一个json格式的HTTP接口, 直接使用php函数json_encode($data)处理数据,返回的数据中包含中文,结构如下:

echo json_encode($data);

{"code":1000,"msg":"succ","data":{"list":[{"pid":"6","video_keys":"\u90fd\u633a\u597d","type":"1"},{"pid":"5","video_keys":"\u7535\u89c6\u5267\u77e5\u5426\u77e5\u5426\u5e94\u662f\u7eff\u80a5\u7ea2\u7626","type":"1"}],"total":6}}

对方的技术希望返回的数据直接是汉字,我自己请求了一遍接口, 因为Chrome装有json解析插件JSONView,curl请求也使用了json解析插件jq, 都格式化好了,看到的结果如下:
继续阅读

使用usort排序的通用方法

一、问题描述
先抛出问题,有一个二维数组,有多个维度的字段,需要计算出各个维度单独的排名, 降序排列?
数据简化后如下:

      // 示例数据生成
      for ($i = 0; $i < 100; $i++) {
            $data = [
                'id' => $i,
                'read_count' => mt_rand(100000, 999999),
                'interactive_count' => mt_rand(10000, 99999),
                'search_count' => mt_rand(1000, 9999),
                'video_count' => mt_rand(100, 999),
                'checkin_count' => mt_rand(100, 999),
                'watch_count' => mt_rand(100, 999),
                'score' => mt_rand(60, 90),
                'play_status' => mt_rand(1, 2),
            ];

            $datas[] = $data;
       }

      // 演示例数据
      function getDemoData()
      {
           $datas = [
	        ['id' => 1,'score' => 10, 'read_count' => 1000, 'search_count' => 90],
	        ['id' => 2,'score' => 80, 'read_count' => 300, 'search_count' => 490],
	        ['id' => 3,'score' => 10, 'read_count' => 500, 'search_count' => 590],
           ];
           return $datas;
      }

二、直接的解发
简单粗暴的办法,你必然能想到,如下:
算法:
0、定义一个排序类,每个维度定义一个排序方法
1、对每个维度分别排一次
2、分别记录每个维度的排名
继续阅读

梦回河西走廊

19年春节去河洛和开封走了走,穿梭在这片曾经为多朝都城的地方,不仅感概历史不再是教科书上简洁的文字,不再是史书上丰富的故事,历史是脚下实实在在的土地,历史是曾经缓慢流过这里的一段段时光。
继续阅读

快速了解Composer

PHP依赖管理工具Composer早有耳闻,但是一直没有了解过。最近研究定时任务调度,发现Laravel框架自带定时任务管理功能,处于好奇就想去看看。

之前完全没有接触学习过Laravel, 按照习惯,先下载安装让框架代码跑起来。打开文档发现需要用Composer安装,那就先了解下Composer呗。进入Composer官网发现又是一堆文档,目测10分钟是看不完了。

我的目标是快速安装好Laravel,一边调试一边看任务调度的逻辑,结果第一步就被拖住了,我多么希望有一个简单的极致的说明和用法介绍,于是稍微花费了一些功夫有了下面的整理,希望10分钟内你就能明白。
继续阅读

MySQL唯一索引添加和用法

一、唯一索引添加与变更
0、建表加唯一索引ukey_o_d_t,使用关键字unique key(如果只是单列唯一索引,可以在字段后加unique, 如topic):

CREATE TABLE `tv_episode_checkin_summary_log` (
  `id` int(11) unsigned NOT NULL auto_increment COMMENT '自增ID',
  `oid` varchar(128) NOT NULL default '0' COMMENT '选项ID',
  `topic` varchar(256) NOT NULL default '' unique COMMENT '话题词',
  `num` int(11) unsigned NOT NULL default '0' COMMENT '数量',
  `type` varchar(2) NOT NULL default '' COMMENT '类型: 1、小时数;2、天数',
  `dtime` bigint(11) unsigned NOT NULL default '0' COMMENT '数据汇总时间',
  `ctime` bigint(11) unsigned NOT NULL default '0' COMMENT '创建时间',
  `mtime` bigint(11) unsigned NOT NULL default '0' COMMENT '修改时间',
  `ext` varchar(64) NOT NULL default '' COMMENT '扩展字段',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `ukey_o_d_t` (`oid`,`dtime`,`type`),
  KEY `key_t_d_t` (`topic`(255),`dtime`,`type`),
  KEY `key_o_d_t` (`oid`,`dtime`,`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='打卡汇总数据表'

继续阅读

CSRF跨站请求伪造

上篇文章总结了遇到过的一个XSS漏洞问题,这次顺便写写自己了解的CSRF。

一、简介

CSRF是Cross-site request forgery的缩写,中文的世界一般说法是跨站请求伪造。简单地说,就是黑客伪造了一个目标网站的地址,欺骗用户去点击用浏览器打开这个地址,如果用户登陆了这个网站,就可以绕过后台用户身份验证,执行一些操作。
继续阅读

微博投票XSS漏洞

0、案例描述

收到了公司安全组发来的一个反射型XSS漏洞提醒,修复建议:请在参数值输出点做过滤或者编码转换,
链接如下:

http://vote.weibo.com/widget?vid=2977008&amp;amp;skin=&amp;amp;isCustom=1&amp;amp;height=448zdxxn"&amp;gt;&amp;lt;img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%3Ealert(1)%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&amp;amp;lt;script&amp;amp;gt;" title="&amp;amp;lt;script&amp;amp;gt;" /&amp;gt;yptrj

点开后确实呈现了一个弹窗,查看了接收参数和展示参数的地方, 直接展示了接收到的参数。

// controller
$r = $this->getRequest();
$wiget_width = $r->getQuery('width', 600);
$wiget_height = $r->getQuery('height', 600);

// view

<div style="height: <?=$wiget_height?>;px" >;

快速做了一个类型转换,上线修复了问题

$wiget_width  = intval($r->getQuery('width', 600));
$wiget_height = intval($r->getQuery('height', 600));

继续阅读