<?php
function &f(&$a,&$b,$status){
if ($status == 1)
return $a;
else
return $b;
}
$a=100;
$b=200;
$v1 = &f($a,$b,1); //reference $a
$v2 = &f($a,$b,0); //reference $b
$v1 = 11111;
$v2 = 22222;
var_dump($a); //เปลี่ยนตาม $v1
var_dump($b); //เปลี่ยนตาม $v2
วันศุกร์ที่ 15 พฤศจิกายน พ.ศ. 2556
php function return refernce
function return reference ก็คือ function ที่จะคืนค่าเป็น reference ของตัวแปรนั่นเองครับ
วันพุธที่ 30 ตุลาคม พ.ศ. 2556
fairly_rand function
faily_rand function เป็น random function รูปแบบหนึ่ง ที่จะสุ่มตัวเลขขึ้นมาแบบไม่ซ้ำครับ
function fairly_rand($start,$end,$return=1){
//function นี้ $start และ $end ควรจะห่างกันมากๆ
$a = array();
$distance = ($end-$start)/$return;
$a[]=$start;
for($i=$start+$distance;$i<$end-($distance/2);$i+=$distance){
$a[]=($a[]=floor($i))+1;
}
$a[]=$end;
$results = array();
for($i=0;$i<$return*2;$i+=2){
$results[] = rand($a[$i],$a[$i+1]);
}
return $results;
}
$numbers = fairly_rand(1,500,5);
var_dump($numbers);
วันเสาร์ที่ 26 ตุลาคม พ.ศ. 2556
การเรียงลำดับภาษาไทยใน php / sorting thai characters
ในการเรียงลำดับโดย php ถ้าใช้ฟังค์ชั่น sort ธรรมดา จะเรียงทีละ byte หรือเรียงโดยให้ความสำคัญกับสระเท่าพยัญชนะจะทำให้เกิดการเรียงลำดับภาษาไทยที่ผิดพลาดดังนนี้ครับ
การบ้าน,ข้าว,เคย,โค,ไก่,ไข่
(ทำให้คำที่ขึ้นต้นด้วยสระเดียวกันเช่น ไ (สระไอไม้มาลัย) อยู่ติดกัน)
ใน php เราจะใช้การตั้งค่า locale และใช้ usort (User sort) ช่วยให้จัดเรียงลำดับภาษาไทยได้ถูกต้อง ดังนี้ครับ..
function sortthaitis620(&$a){
setlocale(LC_COLLATE, 'thai');
usort ($a, 'strcoll');
}
function sortthai(&$a){//สำหรับ utf8
foreach($a as &$i){
$i = iconv('UTF-8','TIS-620',$i);
}
setlocale(LC_COLLATE, 'thai');
usort ($a, 'strcoll');
foreach($a as &$i){
$i = iconv('TIS-620','UTF-8',$i);
}
}
$a = array('โค','เคย','ไก่','การบ้าน','ข้าว','ไข่');
sortthai($a);
echo implode(',',$a);
sortthaitis620 เป็น function สำหรับ เรียงลำดับข้อความภาษาไทยในตัวอักษรที่เข้ารหัสแบบ tis620 หรือ windows874
sortthai เป็น function สำหรับ เรียงลำดับข้อความภาษาไทยในตัวอักษรที่เข้ารหัสแบบ utf8 ครับ
แต่ถ้าต้องการเรียงลำดับข้อมูลในตารางของฐานข้อมูล mysql ที่ encoding เป็น utf8 ให้ select ดังนี้ครับ
SELECT * FROM tb ORDER BY CONVERT (column_name USING tis620);
วันอังคารที่ 8 ตุลาคม พ.ศ. 2556
เครื่องมือช่วยสร้างรูปปุ่ม
อันนี้ใช้ง่ายดีครับ
http://dabuttonfactory.com/
อันนี้ใช้ยากกว่าแต่มีรูปแบบมากกว่า :)
http://www.grsites.com/generate/generator/2001/?
http://dabuttonfactory.com/
อันนี้ใช้ยากกว่าแต่มีรูปแบบมากกว่า :)
http://www.grsites.com/generate/generator/2001/?
วันจันทร์ที่ 23 กันยายน พ.ศ. 2556
Testing Corona SDK Native TextField on Windows
Native TextField is not supported in Corona Simulator
But we can use App Player Like BlueStack for testing.
local inputWeight = native.newTextField(10,10,50,10)
inputWeight:setReturnKey("done")
inputWeight:addEventListener("userInput", function( event )
if event.phase == "submitted" then
storyboard.WeightSubmit() ---- THE MOST PROBLEMATIC
native.setKeyboardFocus(nil)
elseif event.phase == "ended" then
native.setKeyboardFocus(nil)
end
end)
The code pattern of native-textfield section is very easy. That is not a problem.
The real problem is the submit function.
You should test storyboard.WeightSubmit() in the Corona Simulator
until you sure everything is work. Because the simulator will tell you every time the error occur.
If you skip this step and go to test on Bluestack or on The real device, Debuging will be very complex and difficult. That's all. :)
วันศุกร์ที่ 14 มิถุนายน พ.ศ. 2556
การค้นหาแบบช่วงวันที่
สมมติว่า $date_start_search และ $date_end_search เป็นข้อมูลจากช่องกรอกข้อมูลวันที่
ในรูปแบบ yyyy-mm-dd ตัวอย่างเช่น 2013-01-01
กรณี 1
ช่วงวันที่ค้นหา(ทั้งหมด) อยู่ข้างในระหว่างช่วงวันที่ในฐานข้อมูล
.............|---------------|.................ช่วงวันที่ค้นหา
........||==============||.............ช่วงวันที่ในฐานข้อมูล
.............(---------------).................ช่วงข้อมูลที่ได้รับจากฐานข้อมูล
อยู่ในรูปของ sql query:
SELECT * FROM date_test WHERE
'$date_start_search' >= date_start AND '$date_end_search' <= date_end
กรณี 2
ช่วงช่วงวันที่ในฐานข้อมูล(บางส่วน) อยู่ข้างในช่วงวันที่ค้นหา
....|---------------|
.........||============||
.........(-----------)
หรือ
..........................|---------------|
.........||============||
........................(--------)
อยู่ในรูปของ sql query:
SELECT * FROM date_test WHERE date_start BETWEEN '$date_start_search' AND '$date_end_search'
SELECT * FROM date_test WHERE date_end BETWEEN '$date_start_search' AND '$date_end_search'
ตามลำดับ
กรณี 3
ช่วงวันที่ในฐานข้อมูล(ทั้งหมด) อยู่ข้างในระหว่างช่วงวันที่ที่ค้นหา
.....|------------------------------|
.........||============||
.........(-------------------)
อยู่ในรูปของ sql query:
SELECT * FROM date_test WHERE
date_start >= '$date_start_search' AND date_end <= '$date_end_search'
- เพียงแค่ query ของกรณีที่ 2 ก็ครอบคลุมกรณีที่ 3 แล้ว
- ส่วนกรณีที่ 2 ยังไม่ครอบคลุมกรณีที่ 1 เนื่องจากในกรณีที่ 1
ทั้ง date_start และ date_end ไม่ได้อยู่ข้างใน $date_start_search, $date_end_search
ทำให้ query ของกรณีที่ 2 ไม่สามารถค้นพบหากเกิดกรณีที่ 1 ขึ้น
ดังนั้น query ที่สมบูรณ์จะอยู่ในรูปแบบ
SELECT * FROM date_test WHERE
( '$date_start_search' >= date_start AND '$date_end_search' <= date_end )
OR ( date_start BETWEEN '$date_start_search' AND '$date_end_search' )
OR ( date_end BETWEEN '$date_start_search' AND '$date_end_search' )
ก็จะเป็นคำสั่งค้นหาข้อมูลในฐานข้อมูลที่อยู่ในช่วงวันที่ๆ ต้องการครับ :)
ในรูปแบบ yyyy-mm-dd ตัวอย่างเช่น 2013-01-01
กรณี 1
ช่วงวันที่ค้นหา(ทั้งหมด) อยู่ข้างในระหว่างช่วงวันที่ในฐานข้อมูล
.............|---------------|.................ช่วงวันที่ค้นหา
........||==============||.............ช่วงวันที่ในฐานข้อมูล
.............(---------------).................ช่วงข้อมูลที่ได้รับจากฐานข้อมูล
อยู่ในรูปของ sql query:
SELECT * FROM date_test WHERE
'$date_start_search' >= date_start AND '$date_end_search' <= date_end
กรณี 2
ช่วงช่วงวันที่ในฐานข้อมูล(บางส่วน) อยู่ข้างในช่วงวันที่ค้นหา
....|---------------|
.........||============||
.........(-----------)
หรือ
..........................|---------------|
.........||============||
........................(--------)
อยู่ในรูปของ sql query:
SELECT * FROM date_test WHERE date_start BETWEEN '$date_start_search' AND '$date_end_search'
SELECT * FROM date_test WHERE date_end BETWEEN '$date_start_search' AND '$date_end_search'
ตามลำดับ
กรณี 3
ช่วงวันที่ในฐานข้อมูล(ทั้งหมด) อยู่ข้างในระหว่างช่วงวันที่ที่ค้นหา
.....|------------------------------|
.........||============||
.........(-------------------)
อยู่ในรูปของ sql query:
SELECT * FROM date_test WHERE
date_start >= '$date_start_search' AND date_end <= '$date_end_search'
- เพียงแค่ query ของกรณีที่ 2 ก็ครอบคลุมกรณีที่ 3 แล้ว
- ส่วนกรณีที่ 2 ยังไม่ครอบคลุมกรณีที่ 1 เนื่องจากในกรณีที่ 1
ทั้ง date_start และ date_end ไม่ได้อยู่ข้างใน $date_start_search, $date_end_search
ทำให้ query ของกรณีที่ 2 ไม่สามารถค้นพบหากเกิดกรณีที่ 1 ขึ้น
ดังนั้น query ที่สมบูรณ์จะอยู่ในรูปแบบ
SELECT * FROM date_test WHERE
( '$date_start_search' >= date_start AND '$date_end_search' <= date_end )
OR ( date_start BETWEEN '$date_start_search' AND '$date_end_search' )
OR ( date_end BETWEEN '$date_start_search' AND '$date_end_search' )
ก็จะเป็นคำสั่งค้นหาข้อมูลในฐานข้อมูลที่อยู่ในช่วงวันที่ๆ ต้องการครับ :)
วันเสาร์ที่ 2 มีนาคม พ.ศ. 2556
XML Printer Class
<?php
$printer = new XMLPrinter('$data',array('path','value'));
$printer->write('111222222 ');
class XMLPrinter{
public $columns = array();
public $onlyFirstElement = false;
public $rootName = '$root';
public function __construct($rootName='$root',$columns=array('type','path','value'),$onlyFirstElement=false){
$this->rootName = $rootName;
$this->columns = $columns;
$this->onlyFirstElement = $onlyFirstElement;
}
public function write($data){
if (!$data instanceof SimpleXMLElement)
$data = simplexml_load_string($data);
$this->writeHeader();
$this->_write($data,$this->rootName,0);
$this->writeFooter();
}
public function _write(SimpleXMLElement $data,$name){
$children = array();
foreach($data as $item)
$children[] = $item->getName();
$children = array_unique($children);
foreach($children as $child){
$item = $data->$child;
$isArray = isset($item[1]);
$i = -1;
while(isset($item[++$i])){
$arrayPat = $isArray ? "[$i]" : '';
$elementPat = $name.'->'.$item[$i]->getName().$arrayPat;
if (count($item[$i]->attributes())>0)
foreach($item[$i]->attributes() as $attr=>$value)
$this->writeRow('attribute', $elementPat."['$attr']", $value);
if (count($item[$i]->children())>0)
$this->_write($item[$i]->children(),$elementPat);
else
$this->writeRow('element', $elementPat, $item[$i]);
if ($this->onlyFirstElement)
break;
}
}
}
public function writeHeader(){
echo '<style>';
echo "nobr{max-width:600px;overflow:hidden;display:block;}";
echo '</style>';
echo '<table border="0" cellspacing="0"><tr>';
foreach($this->columns as $column)
echo '<th>'.$column.'</th>';
echo '</tr>';
}
public function writeRow($type,$path,$value){
if (strlen(trim($value)) > 0){
echo '<tr>';
foreach($this->columns as $column)
echo '<td><nobr>'.htmlspecialchars($$column).'</nobr></td>';
//echo '<td><nobr>echo \'<br>'.str_replace("'",'\\\'',htmlspecialchars($$column)).'=\','.htmlspecialchars($$column).';</nobr></td>';
echo '</tr>';
}
}
public function writeFooter(){
echo "</table>";
}
}
สมัครสมาชิก:
บทความ (Atom)