PHP 数组函数 array_column

PHP 中的数组可以说是其最闪亮的语言特性之一,围绕数组操作,PHP 提供了数十个相关函数,今天本文介绍的 array_column 函数是这些函数中的小弟弟,首次出现于 PHP 5.5 中,它的作用是返回数组中指定列的所有值,如果不理解字面的解释,那我们看下面一段代码,$records 变量表示的是一个与数据库记录集对应的数组,数组中的每一项代表一条记录,每条记录包含三个字段(列):idfirst_namelast_name,如果我们想获得所有 first_name 字段(列)的值,在 PHP 5.5 之前,我们要用 foreach 语句或 array_walkarray_map 等函数来自编码实现,但自 PHP 5.5 起,我们只需简单调用 array_column 函数即可:

<?php
// 数组表示数据库返回的记录集
$records = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones',
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
    )
);
 
$first_names = array_column($records, 'first_name');

print_r($first_names);
?>

array_column 函数声明如下:

array array_column ( array $array , mixed $column_key [, mixed $index_key = null ] )

第一个参数是要操作的数组,第二个参数是要返回的字段(列)的键名,可选的第三个参数指定其值用作索引键的字段(列)名。

比如,在上面的例子中,输出结果如下:

Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)

如果想指定 id 字段(列)的值作为返回数组的索引键,那么指定第三个参数为 id 即可:

<?php
// 使用上例中的记录数组
$first_names = array_column($records, 'first_name', 'id');
print_r($first_names);
?> 

输出结果如下:

Array
(
    [2135] => John
    [3245] => Sally
    [5342] => Jane
    [5623] => Peter
)

ThinkPHP 资源路由的两种定义方式

ThinkPHP 5 支持设置 RESTFul 请求的资源路由,在路由配置文件 route.php 中即可使用 Route::resource 方法进行动态注册:

use think\Route;

Route::resource('blog', 'index/blog');

也可在路由配置文件 route.php 最后的返回数组中通过 __rest__ 键添加资源路由定义:

return [
    // 定义资源路由
    '__rest__' => [
        // 指向 index 模块的 blog 控制器
        'blog' => 'index/blog',
    ],
    // 定义普通路由
    'hello/:id' => 'index/hello',
]

如果是多级控制器,其定义方式如下:

use think\Route;

Route::resource('api/v1/feedback', 'api/v1.Feedback');

return [
    '__rest__' => [
        'api/v1/feedback' => 'api/v1.Feedback',
    ],
]

在线查看 Office 文件

如果你想让访客能够在未安装 Office 的情况下也能查看网站上的 Office 文档,可以使用微软提供的 View Office documents online 服务,只需提供文档的 URL,即可在浏览器中在线查看各类 Office 文档(Word、 Excel、PowerPoint)。

访问 View Office documents online 服务。

实际上,你只需把文档的网址(必须以 http://https:// 开头)通过 src 参数指定给以下网址就可以了:

`
https://view.officeapps.live.com/op/view.aspx?src=文档网址
`

PHP 简单异步 HTTP 请求实现

某些情况下,我们只需要发出 HTTP 请求,并不需对其响应进行处理,以实现某种通知机制,那么使用异步方式发起该 HTTP 请求无疑更合适。在 PHP 中,我们可通过 fsockopen 函数来实现此需求,下面是代码:

function async_http_get($url, $host = '') {
    $host = empty($host) ? parse_url($url, PHP_URL_HOST) : $host;
    $host = empty($host) ? $_SERVER['HTTP_HOST'] : $host;

    $fp = fsockopen($host, 80, $errno, $errstr, 30);
    if (!$fp) {
        return "$errno: $errstr";
    }

    $out  = 'GET '.$url.' HTTP/1.1' . "\r\n";
    $out .= 'Host: '.$host."\r\n";
    $out .= 'Connection: close'."\r\n\r\n";

    fwrite($fp, $out);
    fclose($fp);

    return true;
}

PHP 中根据地理位置经纬度坐标计算两点距离

在涉及地理位置的应用场景中,往往需要计算两点的距离,比如根据用户所处位置,计算各门店与其距离。下面的 PHP 函数根据两点的经纬度坐标计算两点距离。

function calc_distance($lon1, $lat1, $lon2, $lat2)
{
    // 角度转换为弧度
    $ew1 = $lon1 * 0.01745329252;
    $ns1 = $lat1 * 0.01745329252;
    $ew2 = $lon2 * 0.01745329252;
    $ns2 = $lat2 * 0.01745329252;
    // 求大圆劣弧与球心所夹的角(弧度)
    $distance = sin($ns1) * sin($ns2) +
        cos($ns1) * cos($ns2) * cos($ew1 - $ew2);
    // 调整到[-1..1]范围内,避免溢出
    if ($distance > 1.0) {
         $distance = 1.0;
    } else if ($distance < -1.0) {
        $distance = -1.0;
    }
    // 求大圆劣弧长度
    $distance = 6370693.5 * acos($distance);
    return $distance;
}