[PHP Room] แชร์ PHP กันวันละนิด

เริ่มโดย EThaiZone, 05 มีนาคม 2007, 19:27:38

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

EThaiZone

อันนั้นมัน ข้อมูล record มันซ้ำครับ

ให้ไปแก้เลขอินเด็กในตารางนั้นครับ
ปรับเพิ่มสัก 1 หรือ 2 ก็ได้
(auto number อะ)

หรือผมว่าลองสั่ง repair ดูก่อยคัรบ เผื่อหาย
(ไม่แน่ใจ repair ช่วยแก้เลขได้ไหม เหอๆ)

EThaiZone

กลับมาอัพเดตเพิ่มสักเรื่องละกัน

วิธีการทำผลการค้นหาแสดงเป็น %

ผมจะอธิบายแนวคิดนะครับ มันง่ายๆ

ขั้นแรกเราต้องมีผลการค้นหาในรูป array ก่อน ซึ่งถูกเรียงจากมากไปหาน้อยแล้ว
(ใช้พวก sort() ก็ได้)
ยกตัวอย่างนะครับ

$data = array(
"game" => "468",
"psp" => "399",
"dvd" => "271",
"cd" => "254",
"links" => "178",
"jump" => "26"
);


ขั้นแรก ให้เก็บค่าที่มากสุดไว้เป็นเกณฑ์ครับ ให้ใช้ฟังค์ชั่น max() ช่วย

$max = max($data);

ต่อมาใช้ foreach() ในการวนให้ครบทั้งหมดใน array
แล้วเขียนระบบคำนวณ % เทียบเพิ่มลงไป
จะได้ตัวอย่างแบบนี้ครับ

foreach($data as $key => $value) {
$pc = sprintf("%0.2f", ($value/$max)*100);
echo $key." - Found in ".$value."words [".$pc."%]<br/>";
}


โดยหัวใจจะอยู่ที่
$pc = sprintf("%0.2f", ($value/$max)*100);

โดยให้คำสั่ง sprintf() ช่วยแสดงผลแบบเฉพาะแล้วคำนวณหา %
แบบสมัยที่เราๆ ท่านๆ เรียนตอนประถมแหละครับ
ค่าตอนนี้ หาร ค่าที่มากที่สุด คูณ 100

เราก็จะได้ผลแบบ % ได้ครับ

ตัวอย่างแบบเต็ม

<?
$data = array(
"game" => "468",
"psp" => "399",
"dvd" => "271",
"cd" => "254",
"links" => "178",
"jump" => "26"
);

$max = max($data);

foreach($data as $key => $value) {
$pc = sprintf("%0.2f", ($value/$max)*100);
echo $key." - Found in ".$value."words [".$pc."%]<br/>";
}
?>


ผลลัพท์ที่ได้

game - Found in 468words [100.00%]
psp - Found in 399words [85.26%]
dvd - Found in 271words [57.91%]
cd - Found in 254words [54.27%]
links - Found in 178words [38.03%]
jump - Found in 26words [5.56%]


ดูเจ๋งไหมครับ ^^

EThaiZone

อัพเดตสักหน่อย

พอดีมีคำถามจาก msn ว่า..
อ้างถึงเวลาตัดทดศนิยมด้วยฟังค์ชั่น round มันจะปัดเศษด้วย ทำอย่างไรถึงจะไม่ให้มันปัดเศษ

วิธีจัดการเรื่องนี้
Step1
ให้มองที่จุดต่างของข้อมูลดิบก่อน
ซึ่งก็คือเลขมีทศนิยม โดยจุดต่างอยู่ที่ . ดังนั้น
เราก็ใช้ explode() ในการแยกส่วน

Step2
เมื่อค่าถูกแยกเป็น 2 ส่วน
เราก็ใช้ฟังค์ชั่นที่ตัดข้อมูลโดยนับช่วงตัวอักษร
ซึ่งก็คือ substr()

เราก็จะได้แบบนี้ครับ

$num = "55646.4565";
$n_list = explode(".", $num); //Step1
$num = $n_list[0].".".substr($n_list[1], 0, 2); //Step2

echo $num;


หมายเหตุ
ผมพยายามอธิบายแนวคิดให้ฟัง หวังว่าจะเข้าใจนะครับ
ไม่อยากน้ำเยอะเท่าไรหรอกครับ

aomnaruk

อ้างถึงจาก: EThaiZoneเดี๋ยวก่อนกระทู้จะโดนเบี่ยงเบนไปซะก่อน

วันนี้อารมณ์ดีมากๆ (โปรเจ็คเดินหน้าด้วยดี แถมเพิ่งทำ engine ตัวใหม่เสร็จ)

เข้าเรื่อง จำสคริป Related จาก Google ได้ไหมครับ
ที่ผมจำกัดแจกแค่ราวๆ 30 คนอะ

ตอนนี้คิดอีกทีเอามาแจกเลยไว้ถาวรดีกว่า เพราะเท่าที่สำรวจ คนใช้มากกกว่า 60 คนแล้วมั้ง  :lol:

function ggkeyword($keyword) {
   $gg_result = file_get_contents("http://www.google.com/complete/search?hl=en&js=true&qu=".$keyword);
   $gg_reg = '/sendRPCDone\(frameElement, "(.*)", new Array\("(.*)"\), new Array\("(.*) results"\), new Array\(""\)\);/';

   preg_match($gg_reg, $gg_result, $keylist);

   $keyname = split('", "', $keylist[2]);
   $keyhits = split(' result(s*)", "', $keylist[3]);

   $keyhits = str_replace(",", "", $keyhits);

   return array($keyname, $keyhits);
}


วิธีใช้

$key = ggkeyword("test");

for($i=0;$i<10;$i++) {
   echo $key[0][$i]."=".$key[1][$i]."<br>";
}


หวังว่าจะได้ใช้ประโยชน์นะครับ  :D

ทำยังไงให้ได้ผลลัพธ์มากกว่า 10 อะครับ ผมแก้จนอ้วกแตกยังไม่ได้เลยครับ:roll:  :roll:

EThaiZone

ทำไม่ได้ครับ เพราะข้อมูลต้นทางจาก google มันมาแค่ 10  :D

aomnaruk

อ้างถึงจาก: EThaiZoneทำไม่ได้ครับ เพราะข้อมูลต้นทางจาก google มันมาแค่ 10  :D

ใช้ whlie เอาข้อมูลใน array มาวนลูปได้เปล่าครับ
เพราะว่าเราเก็บข้อมูลไว้ใน array เราก็ดึงข้อมูล 10 อันแรกที่ได้รับมาส่งไปคิวรี่อีกแล้วเราก็ได้อีก 100 keywordวนไปเรี่อยๆจนกว่าจะถึงลิมิตอย่างนี้ได้เปล่าครับ :D

EThaiZone

ทำได้ครับ

เมื่อก่อนผมเองก็เคยกะจะเขียนเหมือนกัน

อย่างดึงค่า psp มา 10
แล้วพอมันคืนค่า (สมมุตินะ)
psp cheat
psp hack
psp tools
psp gadget

ก็ตัดเอา psp ออกเหลือแต่  cheat hack tools และ gadget
ก็เอามาค้นใหม่
อะไรแบบนี้อะครับ เคยนึกไว้แต่ไม่ได้เขียน

ตอนนี้ที่เล็งคือระบบค้นคีย์ของ adword
เพราะเห็นมีคนแกะได้ ซึ่งก็คือตัว hypervre
มันเอาคีย์เยอะๆ มาจาก adword ครับ  :D

EThaiZone

#87
กลับมาอัพเดต

การทำ sitemap ให้อยู่ในรูป gzip

เหมาะกับคนทำปั่นๆ sitemap ได้ไม่บวมครับ
เพราะ 1 sitemap ใส่ได้สูงสุด 50000 url
แต่ขนาด url มันอาจทำให้โหลดนาน

แบบแรก อ่านไฟล์เดิมแล้วบีบอัดเป็นไฟล์ใหม่
<?
$data = file_get_contents("sitemap.xml");
$zp = gzopen("sitemap.xml.gz", "w9");
gzwrite($zp, $data);
gzclose($zp);
?>


แบบ 2 ทำตัวเองเป็น gzip
<?
$out = file_get_contents("sitemap.xml");
$out = gzencode($out, 9);

header("Content-Length: ".strlen($out));
header("Content-Type: application/xml");
header("Content-Encoding: gzip");
echo $out;
?>

jansanfong

การแปลงจาก ACII Code --> UTF-8 ดีครับ  :)
MCP, MCTS, MCPD ,MCT

EThaiZone

#89
การตั้งค่า Parameter ในสภาพติดลบ

วันนี้มาอัพเดตเกร็ดที่หลายคนมองข้ามกันไป
ใน php ฟังค์ชั่นจะมีลักษระการใช้งานแนวว่า

function_name(parameter1, parameter2, ...);

ตัวค่า parameter หลายถึงตัวแปร หรือค่าที่เรานำเข้าไปใช้ในฟังค์ชั่น
แต่ในฟังค์ชั่นหลายตัวใน php ที่ถูกกำหนดมา
มีบางตัวที่ถ้าเราใส่ค่าใน สภาพติดลบแล้วจะให้ผลตรงกันข้าม

ยกตัวอย่าง สัก 1 อัน (เวลาไม่พอ เขียนได้นิดเดียว)

อย่างฟังค์ชั่น round ที่ใช้ในการปัดเศษทดนิยม เช่น

echo round(1.95583, 2);

จะได้ค่ากลับมาคือ 1.96 เพราะ parameter ส่วน precision (ตัวเลขหลังจุดทศนิยม)
ซึ่งปกติมีค่าเป็น 0 ได้ถูกกำหนดเป็น 2 ทำให้มีทศนิยม 2 ตำแหน่ง

echo round(1955654.83, -4);

ค่าจะถูกคืนมาเป็น 1960000 ซึ่งตามในความหมายคือ
ค่า -4 ก็คือ ย้อนกลับจากจุด ทศนิยมไป 4 ทำให้เลขเป็นสภาพเต็มหน่วย คือปัดหน่วยที่โดนสั่งให้เป็น 0

เห็นไหมครับว่าผลมันจะตรงกันข้ามเลย
ยังมีอีกหลายฟังค์ชั่นให้ลองกัน
ลองทำดูครับ มันช่วยเราได้หลายแง่เลย  :)

* EThaiZone ขออนุญาตใช้สิทธิ์ม็อด ย้ายไปห้องโปรแกรมมิ่งนะครับ + ปักหมุดไว้หน่อยนะ

EThaiZone

แนะนำทูลอีกตัวหนึ่ง จากพี่ Tee++; แนะนำอีกแล้ว

http://jquery.com/

ลองไปใช้ดูครับ แล้วคุณจะรู้ว่า ทำ ajax ให้กูเกิ้ลอินเด็กได้ด้วย มันทำกันยังไง ^^

เป็นเหมือนคลาสตัวหนึ่งของ javascript ให้เขียนใช้งานกันครับ

EThaiZone

การทำรายการที่มี comma คั่น

สำหรับหลายคนที่อยากทำการแสดงผลค่าในรูป , คั่นแต่ละอัน
ถ้าในกรณีเป็นแค่คำธรรมดา แนะนำให้ใช้
implode() ในการสร้างคำ

แต่สำหรับคนทำเป็นลิงค์ ใช้วิธีนี้ก็ได้ครับ

$list = array("ant", "boy", "cat");

foreach($list as $key => $var) {
if($key != 0) $show .= ", ";
$show .= '<a href="'.$var.'.html">'.$var.'</a>';
}

echo $show;


ลองประยุกต์ดูนะครับ

การหารเอาเศษ

การหารเอาเศษเป็นสิ่งที่หลายคนมักมองข้ามไป
แต่หลายคนไม่รู้ว่าความสามารถมันเหลือล้ำกว่าบวกลบคูณหารธรรมดาซะอีก

ใช้แยกเลขคู่และคี่
$num = 8;
if($num%2 == 0)
echo "เลขคู่";
else
echo "เลขคี่";


ใช้กำหนดเพดานสูงสุดของตัวเลข
$num = array(102,650,985,751,356,415);
$limit = 100;
foreach($num as $key => $var) {
$num[$key] %= 100;
}
print_r($num);


ความจริงมีมากกว่านี้ แต่ขึ้นอยู่กับทักษะนะครับ
หมั่นใช้แล้วมันจะให้คำตอบกับท่านเอง

:)

EThaiZone

#92
การเรียกรายการข้อความโดยไม่เกิดปัญหา

หลายคนมักใช้คำสั่งในการเรียกรายการคำ เช่น รายการคีย์เวิร์ดกัน
ซึ่งเหมาะกะขาปั่น โดยฟังค์ชั่นที่เราๆ ใช้กันคือ file()
โดยจะดึงค่าในไฟล์แล้วคืนค่าออกมาในลักษณะอาเรย์
โดย 1 คีย์ต่อ 1 บรรทัดในนั้น

แต่หลายคนเมื่อใช้คงมีหลายครั้งที่เจอกะ Invisible Space (ช่างว่างที่มองไม่เห็น)
โดยคุณจะเห็นใน IE หรืออื่นๆ ว่ามีช่องว่าง แต่คุณจะ view source ไม่เจอ และไล่ดูจากในโค้ดไม่เจอ

ยกตัวอย่างเหตุการณ์หนึ่งจาก MSN ระหว่างผมกะพี่ปุ๊ก Pook ณ Ecomhost
(ตัดทอนออกบางส่วนตามความเหมาะสม)

อ้างถึง(21:10)    นายกระปุก: ผมแก้เหลือแค่นี้อ่ะครับ แต่ดันมี blank ข้างหน้า
(21:10)    นายกระปุก: เซ็งเลย
(21:11) EThaiZone.Com :: อ้อ
(21:11) EThaiZone.Com :: รุแล้ว
(21:11) EThaiZone.Com :: สาเหตุมาจากการใช้ file() เพรียวๆ ครับ
(21:11) EThaiZone.Com :: $list=str_replace(array("\r", "\n"), "", file('test.txt'));
(21:11) EThaiZone.Com :: ผมเคยเป็นแล้วโดนบ่อย
(21:12)    นายกระปุก: อ่อ
(21:12)    นายกระปุก: ต้องใช้ $list=str_replace(array("\r", "\n"), "", file('test.txt')); งี้เหรอครั
(21:12) EThaiZone.Com :: ครับ
(21:13) EThaiZone.Com :: ลองดูเลย รับรอง bloank ปริศนาหายขาดครับ
(21:13) EThaiZone.Com :: กำ เผลอกดตัว o  *-*
(21:13)    นายกระปุก: เยี่ยม
(21:13)    นายกระปุก: หายจริงๆ

เรื่องของเรื่องอยู่ที่ เวลาเรากดขึ้นบรรทัดใหม่ใน notepad
มันจะใส่ \r\n ลงไปในระบบ แต่พอเราใช้คำสั่ง file() มันจะเหมือนใช้ file_get_contents() + explode()
โดยมันจะตัด \r ทิ้งไป ทำให้เหลือแต่ \n เลยทำให้เกิดช่องว่างปริศนา

ดังนั้น เราสามารถใช้  str_replace() ตัดเอา \n ออกไปได้คัรบ ก็จะหาย

ถ้าเรามาเขียนเป้นฟังค์ชั่นใช้งานง่ายๆ ก็ได้เป็น

function file_get_array($filename) {
//ตรวจการมีอยู่ของไฟล์ ถ้าไม่มีคืนค่า false
if(!file_exists($filename)) return false;
//ใช้คำสั่ง file แล้วตัด \n ออก
$array = str_replace(array("\n"), "", file($filename));
//คืนค่าอาเรย์ที่ได้
return $array;
}


ลองนำไปใช้ดูนะครับ
มันเหมาะกับการเขียนระดับสูงที่ต้องการระบบวิเคราะห์คำเพื่อกันความผิดพลาดครับ

:)

อัพเดต

อีกวิธีด้วยคำสั่ง trim() + array_walk() (เป็นคำสั่งให้วนลูปอาเรย์แล้วทำงานในฟังค์ชั่นนั้นๆ)

function trim_value(&$value)
{
    $value = trim($value);
}

$array = trim(file($filename));

array_walk($array, 'trim_value');


Credit: PHP.NET
ลองดูครับ

EThaiZone

#93
ตอนพิเศษ : Loop in the loop

หลายท่านเคยต้องการเขียนลูปเรียกซ้อนลูปไหม
ผมไม่ต้องการรู้หรอก (คนอ่าน :  :o)
แต่ผมเคยคิดทำเหมือนกัน

เอาไว้ทำอะไร.. เขียน decoder ครับ (คุกเห็นๆ)
สมมุติผมต้องการให้มันไล่อ่านโฟลเดอร์ทั้งหมดที่ลึกเข้าไป

อืม.... งั้นงานนี้ก็ต้องวนลูปเนอะ
แต่มันซ้อนเยอะอะ ทำไงดี

งานนี้เลยเป็นที่มาของตอนพิเศษ Loop in the loop  8) (เสียง : แต่น แต้น แต๊นน~~~)

พิเศษยังไง ง่ายๆ ครับ
ผมจะไม่อธิบาย เอาโค้ดไปอ่านกันเอาเอง จบข่าว  :o

<?
$mainpath = dirname(__FILE__)."/";

function getdir($path) {
$flist = opendir($path);
$list = array();
while (false !== ($mfile = readdir($flist))) {
$list = array_merge((array)$list, (array)$mfile);
}
sort($list);
array_splice($list, 0, 2);
return $list;
}

function checkdir($path) {
$list = getdir($path);
foreach($list as $var) {
if(is_dir($path.$var)) {
//แสดงว่าเปิดโฟลเดอร์ไหน
echo "<br/><b>Dir :</b> ".$path.$var."/<br/>";
//ตรงนี้มันอะไรน้อ อิๆ
checkdir($path.$var."/");
} else {
//แสดงชื่อไฟล์
echo $path.$var."<br>";
}
}
}

checkdir($mainpath."");
?>


เทคนิคแถมท้าย
ถ้าท่านต้องการความวินาศสันตะโร + สะใจแก่โฮสของท่าน
กรุณาแก้ echo $path.$var."<br>";
ให้เป็น unlink($path.$var); แล้วนำไปรันที่รูทของโฮสที่ท่านใช้

รับรอง ใช้งานได้ผล 1000% ไฟล์ทุกท่านจะหลายเกลี้ยงเหลือแต่โฟลเดอร์ เหอๆ
แบบว่าจะลบทั้งทีลบแต่ไฟล์ ไม่ลบโฟลเดอร์ 555+
(พูดแก้หน้า ความจริงคือขี้เกียจเขียนระบบลบโฟลเดอร์เพิ่ม -*- )

harmonic

เยี่ยมครับ ติดตามอ่านอยู่  8)

guy852

#95
พี่โจ้คะ วันนี้ไม่ออนเอ็มเอสเอ้นเหรอ น้องกายรออยู่  :-[

* EThaiZone อย่า quote โดยไม่จำเป็นครับ =__=" (ไม่ได้เกี่ยวกะที่โพสเลย เหอๆ)

guy852

อ้างถึงจาก: guy852 ใน 03 สิงหาคม 2007, 15:52:52
พี่โจ้คะ วันนี้ไม่ออนเอ็มเอสเอ้นเหรอ น้องกายรออยู่  :-[

* EThaiZone อย่า quote โดยไม่จำเป็นครับ =__=" (ไม่ได้เกี่ยวกะที่โพสเลย เหอๆ)


:o :o :o :o :o :o :o :o :o :o
อำนาจมืด
:o :o :o :o :o :o :o :o :o :o

viking

เป็นกระทู้ที่ดีมากๆ ครับ ตามอ่านเรื่อยๆ

lowprofile

#98
การใช้ cURL แทน file_get_contents ครับ แถมด้วยการปลอมตัวเป็น browser เพื่อหลอก server ด้วย

ยกตัวอย่างด้วย script ของคุณ EThaiZone อันนี้แล้วกันครับ

function ggkeyword($keyword)
{
    $gg_result = file_get_contents("http://www.google.com/complete/search?hl=en&js=true&qu=".$keyword);
    $gg_reg = '/sendRPCDone\(frameElement, "(.*)", new Array\("(.*)"\), new Array\("(.*) results"\), new Array\(""\)\);/';
    preg_match($gg_reg, $gg_result, $keylist);
    $keyname = split('", "', $keylist[2]);
    $keyhits = split(' result(s*)", "', $keylist[3]);
    $keyhits = str_replace(",", "", $keyhits);
    return array($keyname, $keyhits);
}


ถ้าต้องการเพิ่มให้ดูข้อมูลด้วย cURL ได้ก็เปลี่ยนเป็น


function ggkeyword($keyword)
{
    $gg_url = "http://www.google.com/complete/search?hl=en&js=true&qu=".$keyword;
    $gg_result = _get_data($url);
    $gg_reg = '/sendRPCDone\(frameElement, "(.*)", new Array\("(.*)"\), new Array\("(.*) results"\), new Array\(""\)\);/';
    preg_match($gg_reg, $gg_result, $keylist);
    $keyname = split('", "', $keylist[2]);
    $keyhits = split(' result(s*)", "', $keylist[3]);
    $keyhits = str_replace(",", "", $keyhits);
    return array($keyname, $keyhits);
}

function _get_data($url)
{
    if (function_exists('curl_init'))
    {
        $agent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)"; // ค่า agent ของ browser ที่เราจะปลอมตัว
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_USERAGENT, $agent); // ปลอมตัวเรียบร้อย
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $result = curl_exec ($ch);
        curl_close ($ch);
    }
    else
    {
        $result = file_get_contents($url);
    }
    return $result;
}



ประมาณนี้ละครับ
ชีวิตนี้น้อยนัก

๏ พายเถิดพ่ออย่ารั้ง   รอพาย
จวนตะวันจักสาย   ส่องฟ้า
ของสดสิ่งควรขาย   จักขาด ค่าแฮ
ตลาดเลิกแล้วอ้า   บ่นอื้นเอาใคร ๚ะ๛


คราวนี้เป็นคราวเงินหมด
ธนาคาร : ไทยพาณิชย์ จำกัด (มหาชน) สาขา : อุดรธานี
ชื่อบัญชี : โครงการช่วยชาติโดยหลวงตามหาบัว ญาณสัมปันโน
เลขที่บัญชี : 510-2-83957-5

bankkungz

อัพเรื่อยๆเลยครับ

จะตามอ่านครับ  8)
[direct=http://www.bethezank.com]Bethezank[/direct]