# php

# php四种基本算法(冒泡、选择、快速、插入)

<?php
/**
 * Created by PhpStorm.
 * User: djspy
 * Date: 2017/8/1
 * Time: 14:42
 */

/**
 * @param array $arr
 *
 * @return array
 * 冒泡排序
 * 两两比较,较大值放后面
 * [4,3,2,1]->[3,4,2,1]->[3,2,4,1]->[3,2,1,4]
 * [2,3,1,4]->[2,1,3,4]->[1,2,3,4]
 */
function bubbleSort(array $arr)
{
    $count = count($arr);
    for ($i = 1; $i < $count; $i++) {
        for ($j = 0; $j < $count - $i; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                $tmp = $arr[$j + 1];
                $arr[$j + 1] = $arr[$j];
                $arr[$j] = $tmp;
            }
            var_dump($arr);
        }
    }
    return $arr;
}

/**
 * @param array $arr
 *
 * @return array
 * 快速排序
 * 使用递归的思想
 * 将第一个值作为中间值,循环比较,比其小的值放入left数组,反之放入right数组,然后进行递归
 * array_merge合并数组
 * 注: 合并时加入中间值
 */
function quickSort(array $arr)
{
    $count = count($arr);
    if ($count <= 1) {
        return $arr;
    }

    $middle = $arr[0];
    $left = [];
    $right = [];
    for ($i = 1; $i < $count; $i++) {
        if ($middle < $arr[$i]) {
            $right[] = $arr[$i];
        } else {
            $left[] = $arr[$i];
        }
    }

    $left = quickSort($left);
    $right = quickSort($right);

    return array_merge($left, [$middle], $right);
}

/**
 * @param array $arr
 *
 * @return array
 * 选择排序
 * 从待排序的数组中选出最小值,放在起始位置
 * [4,3,2,1]->[1,4,3,2]->[1,2,4,3]->[1,2,3,4]
 */
function selectSort(array $arr) {
    $count = count($arr);
    for ($i = 0; $i < $count; $i++) {
        $min = $i;
        for ($j = $i; $j < $count; $j++) {
            if ($arr[$min] > $arr[$j]) {
                $min = $j;
            }
        }
        if ($min != $i) {
            list($arr[$min], $arr[$i]) = [$arr[$i], $arr[$min]];
        }
    }
    return $arr;
}

/**
 * @param array $arr
 *
 * @return array
 * 插入排序
 * 将待比较的值插入到合适的位置
 * [4,1,3,2]->[1,4,3,2]->[1,3,4,2]->[1,2,3,4]
 */
function insertSort(array $arr) {
    $count = count($arr);
    for ($i = 1; $i < $count; $i++) {
        $tmp = $arr[$i];
        for ($j = $i - 1; $j >= 0; $j --) {
            if ($tmp < $arr[$j]) {
                $arr[$j+1] = $arr[$j];
                $arr[$j] = $tmp;
            }
        }
    }
    return $arr;
}
$a = [4, 1, 3, 2];

var_dump(array_unique(bubbleSort($a)));
var_dump(array_unique(quickSort($a)));
var_dump(array_unique(selectSort($a)));
var_dump(array_unique(insertSort($a)));
// 直接使用自带的方法
sort($a);
var_dump($a);
asort($a);
var_dump($a);

# php策略模式

<?php
use Symfony\Component\DependencyInjection\Reference;

/**
 * Class Preferences
 * 单例模式
 * 具体实现
 * 1.私有的构造函数
 * 2.含有一个该类的静态私有对象
 * 3.提供一个静态的公有函数用于创建或获取它本身的私有对象
 * 4.一个私有的clone方法防止克隆
 */
class Preferences {
    private $props = [];
    private static $instance;

    private function __construct() {}

    public static function getInstance() {
        if (empty(self::$instance)) {
            self::$instance = new Preferences();
        }
        return self::$instance;
    }

    public function setProperty($key, $val)
    {
        $this->props[$key] = $val;
    }

    public function getProperty($key)
    {
        echo $this->props[$key];
    }

    private function __clone()
    {
        
    }
}

$db = Preferences::getInstance();
$db->setProperty("name", 'xx');
$db->getProperty("name");

unset($db);

$db2 = Preferences::getInstance();
$db2->getProperty("name");