如无特别说明,以下题目均可用各种技术方案来解答。

Posted by & filed under 每日一题.

【四脚猫】每日一题(5月3日): 如果你要加载xdebug扩展,就需要用zend_extension,那么zend_extension和extension加载扩展有啥区别?

解释:

1
2
一般的模块,或者说大部分的模块,都是用extension加载的。
极少数和zend内核关系紧密的需要用zend_extension 进行加载,如xdebug、 opcache...等等

Posted by & filed under 每日一题.

【四脚猫】每日一题(4月30日): 作为PHP程序员,我们必须熟悉PHP的安装和配置,那么如何知道我们的PHP是TS还是NTS呢,该如何选择呢?

liaomars答案:
输出phpinfo()信息 查看Thread Safety 选项 如果是 enable 就是TS版 否则就是nts版

stang答案:

1
echo ZEND_THREAD_SAFE== 1 ? 'safe thread ' : 'no safe thread';

Posted by & filed under 每日一题.

【四脚猫】每日一题(4月29日): 有这样一个字符串“abcdhahal_12345_olleh.ext”,怎样通过bash shell提取中间的 12345 这个数字?

Zjmainstay这个解法让大家知道了shell下的“substr”

1
2
3
#!/bin/bash
str="abcdhahal_12345_olleh.ext"
echo ${str:10:5}

Eddy看来是个shell高手,awk都用上了!

1
echo "abcdhahal_12345_olleh.ext" | awk -F_ '{print $2}'

以下是另一种解法:

1
2
3
INPUT="abcdhahal_12345_olleh.ext"
SUBSTRING=<code>echo $INPUT| cut -d'_' -f 2</code>
echo $SUBSTRING

Posted by & filed under 每日一题.

【四脚猫】每日一题(4月28日): 如下JS的代码,能否正常运行,试着解释下为什么呢?

1
2
3
4
5
6
7
8
9
<html>
<head>
    <title>JS特殊现象</title>
    <script>
        +function test(){
            alert('abc');
        }()
    </script>
</head>

JS专家潘老师解释:通过在function添加任意的一元运算符,“+”、“-”、“~”… ,会将函数声明转为函数表达式,然后根据运算符优先级,函数表达式优先和后面的括弧结合,导致函数被执行。函数的返回值和前面的运算符结合并执行,但是运算结果没有赋值给变量,所以此运算结果马上会被销毁。

Posted by & filed under 每日一题.

【四脚猫】每日一题(4月27日): 对于给定的PHP数组$items , 如何用程序计算它的深度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
例如 $items=array(1,2,3,4,5); 的深度 为 1

例如 $items=array('1'=>array('name'=>'andy'), 2, 3); 的深度 为 2

以下数组的深度为3
$items = array(
    "foo" => "bar",
    42    => 24,
    "multi" => array(
         "dimensional" => array(
             "array" => "foo"
         )
    )
);

龚佐龙和hello__lemon用递归算法轻松解决了这个问题!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
龚佐龙的解法
<?php
$items=array(1,2,3,4,5);

function array_depth($a){
  $i=1;$j=1;
  foreach($a as $v){
  if(is_array($v)){
    $i=1+array_depth($v);
    if($j < $i){
       $j = $i;
     }
  }
}
return $j;
}

echo array_depth($items);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
hello__lemon 的解法
<?php

function test($arr,$lev = 1,$maxlev = 1){
    if(!is_array($arr)){
        return;
    }
    $maxlev = $lev;
    foreach($arr as $k=>$v){
    if(is_array($v)){
        $maxlev = max($maxlev,test($v,$lev+1,$maxlev));
    }
    }
    return $maxlev;
}

print_r(test($items));

坚持到底的非递归的方式也很独特,有点意思!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$arraystr = serialize($items);
$len=strlen($arraystr);
$deep = 0;
$maxdeep = 0;

for($i=0 ;$i<$len ;$i++){
  if( '{' == $arraystr[$i] ){
    $deep ++ ;
    ($deep > $maxdeep) && $maxdeep = $deep ;
}
  if( '}' == $arraystr[$i] ){
    $deep -- ;
  }
}

echo $maxdeep;

Posted by & filed under 每日一题.

【四脚猫】每日一题(4月26日): 不用PHP的内置函数,实现把10进制数转为2进制字符串。

龚佐龙功底很深厚,用位运算解决了这个问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$num = 106;
$str = null;
$i = 1<<30;

while($i){
if($num & $i){
$str.='1';
}else{
$str.='0';
}
$i = $i >> 1;
}
echo $str;

坚持到底的版本很有特点,用了堆栈来解决,不错!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

//十进制数转为2进制数
function dec2bin($dec) {
$stack = array();
while ($dec != 0) {
array_push( $stack, $dec%2 );
$dec = (int) ($dec / 2 );
}
$binstr='';
while(!empty($stack)){
$binstr.=array_pop($stack);
}
return $binstr;
}

echo dec2bin(25);

Posted by & filed under 每日一题.

【四脚猫】每日一题(4月25日): 很多PHP的系统,都有一个表前缀,例如dedecms的表前缀默认是dede_ ,discuz的表前缀是 cdb_。如果自己安装这些系统,不小心设置了不合适的表前缀,就要自己去删除这些表。 那么有什么办法可以既快速又准确的来删除这些表呢?

风兮蜻蜒的解法,不知道的朋友可以参考学习下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

/**
* @usage php.exe 本文件名 前缀
*/


if ( empty( $argv[ 1 ] ))
{
  exit;
}

$dsn = 'mysql:host=localhost;dbname=test';
$pdo = new PDO( $dsn, 'root', '1234' );
$rs = $pdo->query( 'SHOW TABLES' )->fetchAll();

$prev = $argv[ 1 ];
foreach ( $rs as $t )
{
  $table = $t[0];
  if ( strpos( $table, $prev ) === 0 )
  {
    $pdo->query( "drop table $table" ) and print( "$table droped\n" );
  }
}

Posted by & filed under 每日一题.

【四脚猫】每日一题(4月23日) 有如下二维数组:

1
2
3
4
5
$items= array(
    array('num'=>5,'period'=>3),
    array('num'=>10,'period'=>3),
    array('num'=>15,'period'=>9)
);

对period相同的值的数组,对num求和,怎么处理变成:

1
2
3
4
$items= array(
    array('num'=>15,'period'=>3),
    array('num'=>15,'period'=>9)
);

hello__lemon的解法采用了key_exists 和重新建立新数组的方式,这个方式是处理此类数组问题的通用解决办法,值得大家参考。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$arr1 = array(
 array('num'=>5,'period'=>3),
 array('num'=>10,'period'=>3),
 array('num'=>15,'period'=>9),
 array('num'=>15,'period'=>7),
 array('num'=>22,'period'=>3),
 array('num'=>22,'period'=>9),
);

$arr2 = array();
foreach($arr1 as $k=>$v){
if(!key_exists($v['period'],$arr2)){
  $arr2[$v['period']] = $v['num'];
} else {
   $arr2[$v['period']] += $v['num'];
}
}
$arr3 = array();
foreach($arr2 as $k=>$v){
   $arr3[] = array('sum'=>$v,'period'=>$k);
}

print_r($arr3);

asun的解法巧妙的用了sort这个函数,比上一个解法更节省代码!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$data = array();
foreach ($items as $key=>$value)
{
 if (array_key_exists($value['period'], $data))
 {
    $data[$value['period']]['num'] += $value['num'];
 }
 else
 {
    $data[$value['period']] = array('num'=>$value['num'],'period'=>$value['period']);
 }
}
sort($data);

var_dump($data);

TNT的解法和hello__lemon的解法类似,不同的是用了isset判断数组的元素是否存在,那么抛出个问题,isset 和 key_exists 有什么差异,有人知道吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$items= array(
 array('num'=>5,'period'=>3),
 array('num'=>10,'period'=>3),
 array('num'=>15,'period'=>9)
);
$new_items = array();
foreach($items as $key=>$item){
 if(isset($new_items[$item['period']])){
  $new_items[$item['period']] += $item['num'];
 }else{
  $new_items[$item['period']] = $item['num'];
 }
}
$newItems = array();
$i = 0;
foreach($new_items as $key=>$new_item){
  $newItems[$i]['num'] = $new_item;
  $newItems[$i]['period'] = $key;
  $i++;
}
var_dump($newItems);
exit;

Posted by & filed under 每日一题.

【四脚猫】每日一题(4月22日) :定义一个shell下的函数,实现递归求和。

Zjmainstay很是厉害,写的很漂亮!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
=========华丽的分隔线=============

#!/bin/bash

#filename: shell_func_sum.sh

##1~N求和函数(N为输入参数)
##example: $./shell_func_sum.sh 100
##result : 5050
function sum() {
    local args=0; #局部变量,存储递归参数
    sumRes=0; #全局变量,存储求和
    if [ $1 -le 1 ] #如果参数小于等于1,直接返回
    then
        sumRes=$1
    else
        ((args=$1-1)); #自运行函数求递归参数
        sum $args; #递归调用
        ((sumRes=$1+$sumRes)); #存储递归调用后的值
    fi
}

#调用函数
sum $1;
echo $sumRes;

justhobbily也是shell高手了,轻松就写出了大段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
支持3个参数:初始化被加数,步长,最大加数
#!/bin/bash

INIT=$1
STEP=$2
FINAL=$3
#if [ $INIT -gt $FINAL ];then
# echo 'the init addend must less than final addend';
# exit;
#fi
SUM=0
function recSum()
{
if [ $INIT -gt $FINAL ] && [ $STEP -gt 0 ];then
echo $SUM;
elif [ $INIT -lt $FINAL ] && [ $STEP -lt 0 ];then
echo $SUM;
else
# ((SUM=SUM+INIT))
# ((INIT=INIT+STEP))
SUM=<code>expr $SUM + $INIT</code>;
INIT=<code>expr $INIT + $STEP</code>;
recSum $SUM $STEP $FINAL
fi
}

recSum $SUM $2 $3