php 刪除數組中的元素

2013年8月7日 沒有評論

刪除數組中的元素,第一想法是使用unset函數,它確實可以刪除,但是可能會在后面操作該數組的時候出現問題。通過下面的例子來說明:

$arr = array(0, 1, 2, 3, 4);
$index = 2;
unset($arr[$index]);
echo count($arr);

if (empty($arr[$index])) {
    echo "arr[$index] is empty";
}

print_r($arr);

輸出為:
4
arr[2] is empty
Array([0] => 0 [1] => 1 [3] => 3 [4] => 4)

從上面的輸出結果可以看到數組的長度是正常的,但是下標還是保持原來的,所以按照下標去獲取元素就會出問題。另外此方法對key-value形式的數組是安全的。

如何安全的刪除元素呢?可以使用array_splice函數。array_splice()的用途是刪除原始數組中指定的一系列元素,并用其他值代替(如果指定),返回值是被刪除的元素。更多信息可以參考官方文檔:http://php.net/manual/zh/function.array-splice.php。例如:

$arr = array(0, 1, 2, 3, 4);
$rtn = array_splice($arr, 2, 1);
echo count($arr);
print_r($arr);
print_r($rtn);

輸出為:
4
Array
([0] => 0 [1] => 1 [2] => 3 [3] => 4)
Array([0] => 2)

如果想獲取刪除首位元素后的數組,則可以有兩種方法:

1、
$arr = array(0, 1, 2, 3, 4);
array_splice($arr, 0, 1);

2、
$arr = array(0, 1, 2, 3, 4);
$arr = array_splice($arr, 1);
分類: PHP 標簽: ,

Mac osx lion flash 無法升級問題

2013年8月6日 沒有評論

最近瀏覽器提示flash有新版本,需要升級,按提示提示去adobe的官網下載安裝包,注意這個安裝包大小不到1M,只是一個殼,它會去下載最新版所需要的文件,但是每次通過它安裝都是失敗(下載文件進度條在50%左右的時候),也沒有給任何錯誤提示,很是郁悶。后來查了一下,有人說要先卸載老版本的,卸載程序在:應用程序 –> 使用工具中,卸載后安裝還是失敗,這下麻煩了,新的安裝不了,老的又卸載了。進過一番折騰最后終于安裝上最新版的flash了。下面介紹詳細步驟。

首先進入 http://get.adobe.com/cn/flashplayer/ 點擊“立即下載”轉到 http://get.adobe.com/cn/flashplayer/download/?installer=Flash_Player_11_for_Mac_OS_X_10.6_-_10.9&os=OSX&browser_type=Gecko&browser_dist=Firefox&d=Adobe_Photoshop_Lightroom_for_Macintosh&dualoffer=false這個頁面,此時會提示保存下載文件,選擇取消,在此頁面的左下角找到“單擊此處*以查看疑難解答信息”,點擊“單擊此處”去到頁面 http://helpx.adobe.com/flash-player/kb/installation-problems-flash-player-mac.html,這個頁面都是一些無用的幫助信息,不過上面提供了一個離線安裝包到是最有用的,查找”Download from the direct link“,在其下面一行有”Click here to download Flash Player“,點擊”here“就會開始下載離線安裝包。通過這個離線安裝包,順利安裝最新版flash。

javascript array sort用法

2013年8月6日 沒有評論

sort是array對象自帶的方法,可以對array中的元素按升序的方式進行排列。如果sort方法沒有指定參數,那么array的元素會按照字符的編碼數據進行排序。如果想對其他類型的元素進行排序,就需要自己實現一個比較函數作為參數傳遞給sort,此函數有兩個參數a和b,當 a 大于 b 返回大于0的數,a 等于 b 返回0,否則返回一個小于0的值。

需要注意的是排序是在原array上進行的,不會生成副本。

例如一個array為[20,17,15,30,100],默認排序后的結果為100,15,17,20,30。可以看到并不是按照數值的大小排序,如果想要按照數值的大小排序,可以自己實現一個function,如:

function intSort(a, b) {
  return a - b;
}

var arr = [20,17,15,30,100];
arr.sort(intSort);

//或通過匿名函數的方式

arr.sort(
  function(a, b) {
    return a - b;
  }
);

//倒序排序
arr.sort(intSort).reverse();

另外如果想按照倒序排列,可以先對array進行sort,然后調用reverse方法即可。

通過命令行執行mysql命令

2013年8月5日 沒有評論

有兩種方法可以在命令行下執行sql命令。第一種是使用“-e“參數來指定需要執行的sql語句;第二種是通過管道的方式。語法及例子如下:

1、
MYSQL_HOME/bin/mysql -u用戶名 -p密碼 -D數據庫名 -e"sql 語句"
/usr/local/mysql/bin/mysql -uroot -p123456 -Dmysql -e"select host,user from user";

2、
echo "sql 語句" | MYSQL_HOME/bin/mysql -u用戶名 -p密碼 -D數據庫名
echo "select host,user from user" | /usr/local/mysql/bin/mysql -uroot -p123456 -Dmysql

上面命令執行的結果如下圖。從圖中可以看到二者的顯示結果有些不一樣。

使用場景多用在腳本中,例如定期執行存儲過程、load data infile以及刪除老數據等。

分類: Linux, MySQL 標簽:

jquery table 排序

2013年8月3日 3 條評論

借助于強大的jquery庫,通過一些簡單的js代碼來實現對table數據列進行排序。排序是通過調整table的tr的順序重新顯示,全部在客戶端上完成,不需要和服務器交互,因此減輕了服務器的壓力。查看Demo請猛點這里

實現排序的js代碼如下:

function tableSort(jqTableObj) {
    jqTableObj.find('thead th').click(
        function(){
            var dataType = $(this).attr('dataType') || 'text';
            var index = jqTableObj.find('thead th').index(this) + 1;
            var arr = [];
            var row = jqTableObj.find('tbody tr');

            $.each(row, function(i){arr[i] = row[i]});

            if($(this).hasClass('current')){
                arr.reverse();
            } else {
                arr.sort(Utils.sortStr(index, dataType))

                jqTableObj.find('thead th').removeClass('current');
                $(this).addClass('current');
            }

            var fragment = document.createDocumentFragment();

            $.each(arr, function(i){
                fragment.appendChild(arr[i]);
            });

            jqTableObj.find('tbody').append(fragment);
        }
    );    

    var Utils = (function() {
        function sortStr(index, dataType){
            return function(a, b){
                var aText=$(a).find('td:nth-child(' + index + ')').attr('_order') || $(a).find('td:nth-child(' + index + ')').text();
                var bText=$(b).find('td:nth-child(' + index + ')').attr('_order') || $(b).find('td:nth-child(' + index + ')').text();

                if(dataType != 'text'){
                    aText=parseNonText(aText, dataType);
                    bText=parseNonText(bText, dataType);

                    return aText > bText ? -1 : bText > aText ? 1 : 0;
                } else {
                    return aText.localeCompare(bText)
                }
            }
        }

        function parseNonText(data, dataType){
            switch(dataType){
                case 'int':
                    return parseInt(data) || 0
                case 'float':
                    return parseFloat(data) || 0
                default :
                return filterStr(data)
            }
        }

        //過濾中文字符和$
        function filterStr(data){
            if (!data) {
                return 0;
            }

            return parseFloat(data.replace(/^[\$a-zA-z\u4e00-\u9fa5 ]*(.*?)[a-zA-z\u4e00-\u9fa5 ]*$/,'$1'));
        }

        return {'sortStr' : sortStr};
    })();
}

要想讓上面的代碼工作,需要在原有的table中注意幾點。
1、表頭的tr其父元素為thead,另外表頭列使用th,同時要使用dataType屬性名來標示數據的類型,類型可以為text(默認),int和float;
2、顯示table數據的tr父元素為tbody,顯示數據的列用td,可以使用_order屬性指定該字段的真實值。

table 示例如下:

<table>
  <thead>
    <tr>
      <th datatype="int">ID</th>
      <th datatype="text">Username</th>
      <th datatype="float" class="current">Revenue</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1032</td>
      <td>Zhang</td>
      <td _order="127579">$ 127,579.00</td>
    </tr>
    <tr>
      <td>1074</td>
      <td>gm1</td>
      <td _order="37331">$ 37,331.00</td>
    </tr>
  </tbody>
  <tfoot>
    <tr>
      <th colspan="2">Summary</th>
      <th>$ 164,910.00
    </tr>
  </tfoot>
</table>
分類: web前端 標簽:

nginx 配置禁止訪問目錄或文件

2013年8月1日 沒有評論

要禁止某個或一類資源,只需要增加一個location,然后在其中使用deny all即可。

禁止訪問擴展名為bat的文件,配置如下:

location ~* /\.bat {
    deny all;
}

禁止訪問configs目錄,以及其下所有子目錄或文件,配置如下:

location ^~ /configs/ {
    deny all;
}

注意上述configs后面的斜杠不能少,否則所有以configs開頭的目錄或文件都將禁止訪問。

分類: nginx 標簽:

nginx location 指令匹配順序

2013年8月1日 沒有評論

location指令是server段中的一個指令,可以對不同路徑或不同文件類型進行特殊處理。例如用的比較多的就是針對網站的靜態內容設置緩存。由于一個server段中可以有多個location,而http請求最終只能使用其中的一個,所以有必要弄清nginx是如何選擇location的。

location 指令語法如下:

location [=|^~|~|!~|~*|!~*] uri {

}

上述配置中[]內為可選配置,但只能使用其中一個。關于具體含義,可以參考:nginx 匹配操作符。uri可以是普通字符串或正則表達式。

匹配的順序是先匹配普通字符串,然后再匹配正則表達式。另外普通字符串匹配順序是根據配置中字符長度從長到短,也就是說使用普通字符串配置的location順序是無關緊要的,反正最后nginx會根據配置的長短來進行匹配,但是需要注意的是正則表達式按照配置文件里的順序測試。找到第一個比配的正則表達式將停止搜索。

一般情況下,匹配成功了普通字符串location后還會進行正則表達式location匹配。有兩種方法改變這種行為,其一就是使用“=”前綴,這時執行的是嚴格匹配,并且匹配成功后立即停止其他匹配,同時處理這個請求;另外一種就是使用“^~”前綴,如果把這個前綴用于一個常規字符串那么告訴nginx 如果路徑匹配那么不測試正則表達式。

總結下來location指令的匹配順序為:
1、“=”前綴指令匹配,如果匹配成功,停止其他匹配
2、普通字符串指令匹配,順序是從長到短,匹配成功的location如果使用“^~”前綴,則停止其他匹配。
3、正則表達式指令匹配,按配置文件里的順序,成功就停止其他匹配。
4、如果第3步中有匹配成功,則使用該結果,否則使用第二步中的匹配結果。

分類: nginx 標簽:

php 異步執行腳本

2013年8月1日 沒有評論

這里說的異步執行是讓php腳本在后臺掛起一個執行具體操作的腳本,主腳本退出后,掛起的腳本還能繼續執行。比如執行某些耗時操作或可以并行執行的操作,可以采用php異步執行的方式。主腳本和子腳本的通訊可以采用外部文件或memcached的方式。原理就是通過exec或system來執行一個外部命令。注意:本文所述的是針對Linux環境。

在Linux下要讓一個腳本掛在后臺執行可以在命令的結尾加上一個 “&” 符號,有時候這還不夠,需要借助nohup命令,關于nohup,可以參考http://www.twubdg.tw/linux-nohup.html

CLI環境和Web環境執行的操作還不太一樣。先來說CLI環境,這里需要用上nohup和&,同時還要把指定輸出,如果不想要輸出結果,可以把輸出定向到/dev/null中。現在來做一個測試,假設在一個目錄中有main.php、sub1.php和sub2.php,其中sub1和sub2內容一樣都讓sleep函數暫停一段時間。代碼如下:

//main.php
<?php
    $cmd = 'nohup php ./sub.php >./tmp.log  &';
    exec($cmd);
    $cmd = 'nohup php ./sub1.php >/dev/null  &';
    exec($cmd);
?>

//sub1.php sub2.php
<?php
    sleep(100000);
?>

上述文件中main.php是作為主腳本,在命令行中執行php main.php,可以看到main.php腳本很快就執行完并退出。在使用ps aux | grep sub命令搜索進程,應該可以在后臺看到上述的兩個子腳本,說明成功掛起了子腳本。

在Web環境下,執行php腳本都是Web服務器開啟的cgi進程來處理,只要腳本不退出,就會一直占有該cgi進程,當啟動的所有cgi進程都被占用完后就不能在處理新的請求。所以對那些可能會很費時的腳本,可以采用異步的方式。啟動子腳本的方式和CLI差不多,必須要使用&和指定輸出(只好是定向到/dev/null),但是不能使用nohup。例如:

<?php
    $cmd = 'php PATH_TO_SUB1/sub1.php >/dev/null  &';
    exec($cmd);
    $cmd = 'php PATH_TO_SUB1/sub2.php >/dev/null  &';
    exec($cmd);
?>

當在瀏覽器中訪問該腳本文件,可以看到瀏覽器里面響應完成,同時使用ps命令查看后臺可以看到sub1和sub2腳本。

注意上述例子中如果php命令不在PATH中,需要指定命令完整的路徑。推薦使用完整路徑,特別是在Web下。

mysql partition 功能

2013年7月30日 沒有評論

自mysql 5.1.3起開始支持分區功能。mysql表中存儲的記錄和表對應的索引信息,最后都是以文件的方式存儲在計算機的硬盤上的,有了分區功能,就可以按照一定的分區規則把這些記錄分布到不同的數據文件上,目前分區規則有四種,分別是RANGE、LIST、HASH和KEY,另外通過DATA DIRECTORY和INDEX DIRECTORY選項可以把不同的分區數據文件分散到不同的磁盤上,從而進步一提高系統的IO吞吐量。因此按照業務邏輯設計好了分區,可以大大提高查詢效率,而且刪除數據可能也會很容易。但是分區也有一些限制:1、主鍵或者唯一索引必須包含分區字段;2、只能通過int類型的字段或者返回int類型的表達式來分區;3、單表最多只能有1024個分區。

默認mysql是開啟了分區功能的,可以通過下述查詢查看結果:

show variables like '%partition%';

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| have_partitioning | YES   |
+-------------------+-------+

//YES 表示開啟

下面也range規則為例介紹一下分區常用的命令。

1、創建分區。可以在創建表的同時創建,也可以在表創建后追加分區。

drop table if exists `netingcn_com`;
create table `netingcn_com` (
  `id` int(11) unsigned not null auto_increment,
  `day` int(11) not null default 0,
  primary key (`id`, `day`)
) engine=innodb default charset=utf8 auto_increment=1;

alter table `netingcn_com` partition by range(`day`) (
  partition p_2012 values less than (20130000),
  partition p_2013 values less than (20140000)
);
或
drop table if exists `netingcn_com`;
create table `netingcn_com` (
  `id` int(11) unsigned not null auto_increment,
  `day` int(11) not null default 0,
  primary key (`id`, `day`)
) engine=innodb default charset=utf8 auto_increment=1 
 partition by range(`day`) (
  partition p_2012 values less than (20130000),
  partition p_2013 values less than (20140000)
);

可以explain命令查看分區是否創建成功
explain partitions select * from netingcn_com where day = 20130412;
+----+-------------+--------------+------------+-------+
| id | select_type | table        | partitions | type  |
+----+-------------+--------------+------------+-------+
|  1 | SIMPLE      | netingcn_com | p_2013     | index |
+----+-------------+--------------+------------+-------+

2、增加或刪除分區。注意:刪除分區的同時,該分區的所有數據也會別刪除。

增加分區
alter table netingcn_com add partition (
  partition p_2014 values less than (20150000)
);

刪除分區
alter table netingcn_com drop partition p_2012;

3、重新分區。注意:hash和key分區規則不能用REORGANIZE來重新分區

alter table netingcn_com reorganize partition p_2013,p_2014 into (partition p_2014 values less than (20150000));

更多關于mysql 分區功能可以參考:http://dev.mysql.com/tech-resources/articles/mysql_55_partitioning.html

分類: MySQL 標簽: , ,

Strict Standards: Only variables should be passed by reference in

2013年7月28日 沒有評論

php中使用內置的reset函數可以獲取array的第一個元素的值。例如:

$arr = array('one', 'two', 'three');

echo reset($arr);   // 輸出的結果為 one

對于下述代碼,如果php開啟了“Strict Standards”,將會看到“Strict Standards: Only variables should be passed by reference in”的提示。

$str = 'netingcn.com';

echo reset(explode('.', $str));

為什么會這樣呢?可以先看看reset函數的定義:

function reset (array &$array) {}

從定義中可以看到,reset接受的參數是一個array的引用。而上述代碼中explode返回值不是任何array的引用,所以在“Strict Standards”下會有上述提示。解決辦法很簡單,只需要把reset(explode(‘.’, $str))分兩步寫即可。第一步先把explode的返回值賦給一個變量,第二步把這個變量作為reset參數。

出現上面的提示的不只是reset函數,只要參數接受的是對象引用,而傳值直接使用function返回值都會看到那樣的提示。例如內置的array_pop、shuffle、curent、next、prev、next等等。

分類: PHP 標簽:

無覓相關文章插件,快速提升流量

30选5怎么中奖