#2 PHP 中 foreach 循环赋值给引用的一个特性(坑)

2016-10-17

复现方法

创建一个存文本文件,命名为:test.php,内容如下:

<?php

$menu = [
    1 => ['id' => 1, 'name' => 'a', 'child' => []],
    2 => ['id' => 2, 'name' => 'b', 'child' => []],
];

foreach ($menu as &$submenu) {
    $submenu['class'] = empty($submenu['child']) ? '' : 'hasChild';
}

print_r($menu);

print str_repeat('-', 80) . "\n";

foreach ($menu as $submenu) {
    print_r($submenu);
}
?>

命令行中运行:

php -f test.php

得到以下输出:

Array
(
    [1] => Array
        (
            [id] => 1
            [name] => a
            [child] => Array
                (
                )

            [class] =>
        )

    [2] => Array
        (
            [id] => 2
            [name] => b
            [child] => Array
                (
                )

            [class] =>
        )

)
--------------------------------------------------------------------------------
Array
(
    [id] => 1
    [name] => a
    [child] => Array
        (
        )

    [class] =>
)
Array
(
    [id] => 1
    [name] => a
    [child] => Array
        (
        )

    [class] =>
)

可以发现,第二个 foreach 中的输出是错误的。

来自官网的说明

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)

// without an unset($value), $value is still a reference to the last item: $arr[3]

foreach ($arr as $key => $value) {
    // $arr[3] will be updated with each value from $arr...
    echo "{$key} => {$value} ";
    print_r($arr);
}
// ...until ultimately the second-to-last value is copied onto the last value

// output:
// 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
// 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
// 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
?>

参考

#1 技术博客字体选型

2016-10-17

HTML 字体

font: 300 1em/1.8 sans;

参考

阮一峰          Georgia, serif
开源中国        微软雅黑, Verdana, sans-serif, 宋体
typo.sofi.sh    PingFang SC, Lantinghei SC, Microsoft Yahei, Hiragino Sans GB, Microsoft Sans Serif, WenQuanYi Micro Hei, sans
作业部落        PingFang SC, Hiragino Sans GB, Helvetica Neue, Microsoft Yahei, WenQuanYi Micro Hei, sans-serif
MDN             'Open Sans',Arial,sans-serif
小众软件        Lucida, Verdana, 'Hiragino Sans GB', 'WenQuanYi Micro Hei', sans-serif
码弄周刊        'Helvetica Neue', Helvetica, Arial, 'WenQuanYi Micro Hei', 'Microsoft Yahei', SimSun, sans-serif
Django Book     'Microsoft YaHei', 'Lucida Grande', Verdana;

设计

各平台常用字体

OS X      : PingFang SC, Hiragino Sans GB, Helvetica Neue, Helvetica, Heiti SC, Monaco
Linux     : Ubuntu Mono, WenQuanYi Micro Hei, Source Code Pro
Windows   : Microsoft Yahei, SimSun, Courier New, Georgia, Tahoma, Arial

设计思路

  1. 不用很多,如果没有所选的字体,就是用浏览器默认设置
  2. 优先级:Mac OS > Ubuntu > Windows