
分享一些实用的PHP函数(对比js/ts实现)
在Web开发中,PHP和JavaScript/TypeScript是最常用的后端与前端(及全栈)语言。由于两者的设计哲学和运行环境不同,实现相同业务逻辑时的内置函数差异较大。理解并熟练运用这些差异,能够帮助开发者在前后端之间无缝切换思维,提升开发效率。本文将分享一些日常开发中非常实用的PHP函数,并与JS/TS的实现进行对比分析。
一、数组去重 / 提取唯一值
在处理列表数据时,去重是最常见的操作之一。
PHP实现: PHP提供了原生的array_unique函数,但需要注意它会保留第一个出现的键名,且转换后键名可能不连续,通常配合array_values重置键名。
$arr = [1, 2, 2, 3, 3, 4]; $uniqueArr = array_values(array_unique($arr)); // 结果: [1, 2, 3, 4]
JS/TS实现: 借助ES6的Set对象,代码极其简洁,且天然保持了顺序和连续的索引。
const arr = [1, 2, 2, 3, 3, 4]; const uniqueArr = [...new Set(arr)]; // 结果: [1, 2, 3, 4]
二、根据指定键名对多维数组/对象排序
从数据库或API获取的数据通常是多维数组(或对象数组),经常需要按某个字段进行排序。
PHP实现: PHP使用usort配合自定义回调函数。PHP 7+ 引入了太空船操作符<=>,使得排序比较异常简洁。
$data = [
['name' => 'A', 'age' => 30],
['name' => 'B', 'age' => 20],
['name' => 'C', 'age' => 25],
];
usort($data, function($a, $b) {
return $a['age'] <=> $b['age']; // 按age升序排列
});
// 结果: B(20), C(25), A(30)JS/TS实现: 同样使用sort方法配合比较函数,写法与PHP类似,但JS的减法即可实现数字比较。
const data = [
{ name: 'A', age: 30 },
{ name: 'B', age: 20 },
{ name: 'C', age: 25 },
];
data.sort((a, b) => a.age - b.age); // 按age升序排列
// 结果: B(20), C(25), A(30)三、解析URL查询参数
在处理URL时,经常需要提取Query String中的参数转化为关联数组或对象。
PHP实现: PHP内置parse_url和parse_str,非常强大,parse_str会自动将结果写入第二个变量中。
$url = "https://www.ipipp.com/index.php?name=test&id=123"; $queryStr = parse_url($url, PHP_URL_QUERY); // 获取 "name=test&id=123" parse_str($queryStr, $params); // $params 结果: ['name' => 'test', 'id' => '123']
JS/TS实现: 在浏览器环境或Node.js中,可以使用URL和URLSearchParamsAPI,更加面向对象。
const url = new URL("https://www.ipipp.com/index.php?name=test&id=123");
const params = Object.fromEntries(url.searchParams.entries());
// params 结果: { name: 'test', id: '123' }四、生成URL查询字符串
与解析相反,将数组或对象拼接为合法的URL参数也是高频操作。
PHP实现: http_build_query不仅支持一维数组,还完美支持多维数组的编码,非常实用。
$data = ['foo' => 'bar', 'baz' => 'boom', 'cow' => 'milk']; $queryString = http_build_query($data); // 结果: "foo=bar&baz=boom&cow=milk"
JS/TS实现: 借助URLSearchParams可以快速实现,且自动处理了URL编码。
const data = { foo: 'bar', baz: 'boom', cow: 'milk' };
const queryString = new URLSearchParams(data).toString();
// 结果: "foo=bar&baz=boom&cow=milk"五、安全的HTML实体编码与解码
在Web应用中,防止XSS攻击是重中之重,输出到HTML的用户输入必须进行转义。
PHP实现: htmlspecialchars将特殊字符转换为HTML实体,htmlspecialchars_decode则相反。建议始终加上ENT_QUOTES和UTF-8参数。
$str = "Test"; $encoded = htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); // 结果: "<a href='test'>Test</a>" $decoded = htmlspecialchars_decode($encoded, ENT_QUOTES); // 结果恢复原样
JS/TS实现: 浏览器环境中原生缺少直接的全局编解码函数,通常需要借助DOM操作或引入第三方库(如he库)。下面是一种利用DOM API的简易转义方法:
const str = "Test";
// 简易转义实现
const div = document.createElement('div');
div.appendChild(document.createTextNode(str));
const encoded = div.innerHTML;
// 结果: "<a href='test'>Test</a>"
// 解码
div.innerHTML = encoded;
const decoded = div.textContent;
// 结果恢复原样总结
PHP作为老牌后端语言,在数组、字符串和HTTP协议层面的内置函数极其丰富,往往一个函数就能搞定JS中需要组合操作或引入工具库才能实现的功能。而JS/TS依托ES标准的不断进化以及现代API的补充,代码风格更加偏向函数式和面向对象,写法愈发简洁。掌握两者在常用函数上的差异与对应关系,可以极大地提高我们在全栈开发中的效率。