Posts Tagged ‘ array

แก้ปัญหาการย้ายสิ่งของ ด้วย PHP 23 November 2008 at 2:35 am by tumaji

พอดีว่าผมไปเจอโจทย์ในการแก้ปัญหาด้วย PHP & MySQL โดยโจทย์มีดังนี้


เกี่ยวกับเรื่อง ฐานข้อมูล กับ ตาราง
ตอนนี้มีตารางข้อมูล ที่ได้มาโดยการ select

itemlist_id item name quantity capacity user_id slot use
5 ข้าวโพด 2 15 1 1
32 ขี้ไก่ 9 50 1 1
76 ปลากระโทงแทง 6 5 1 2
79 ปลาฉลาม 2 1 1 2
168 เกลือ 1 50 1 1
*quantity คือ จำนวนของฐานของมูลขอลแต่ละ item name ได้มาจากการ count
capacity คือ จำนวนความจุ ที่ตั้งใจจะนำไปแบ่งแต่ละcell
slot use = ceil(capacity/quantity)

โดยจะนำข้อมูลทั้งหมดไปใส่ในตารางที่ผ่านการ loop
สิ่งที่ตั้งใจทำก็คือ จะแบ่งช่องของสิ่งของเหล่านี้ โดยให้ค่า quantity ไม่เกิน capacity ในแต่ละช่อง
ถ้าสำเร็จผลที่ได้รับคือ

ข้าวโพด2 ขี้ไก่9 ปลาฯ5 ปลาฯ1 ปลาฉลาม1 ปลาฉลาม1 เกลือ1

พอดีว่าผมขี้เกียจสร้าง database เพื่อแก้ปัญหาเลยขอประยุกต์ด้วย Array สำหรับใครที่ต้องการจะเอาไปใช้กับ database อื่นๆก็ดัดแปลงดูแล้วกันครับ

< ?
$data[0] = array('itemlist_id'=>5,'item_name'=>'ข้าวโพด','quantity'=>2,'capacity'=>15,'user_id'=>1,'slot_use'=>1) ;
$data[1] = array('itemlist_id'=>32,'item_name'=>'ขี้ไก่','quantity'=>9,'capacity'=>50,'user_id'=>1,'slot_use'=>1) ;
$data[2] = array('itemlist_id'=>76,'item_name'=>'ปลากระโทงแทง','quantity'=>6,'capacity'=>5,'user_id'=>1,'slot_use'=>2) ;
$data[3] = array('itemlist_id'=>79,'item_name'=>'ปลาฉลาม','quantity'=>2,'capacity'=>1,'user_id'=>1,'slot_use'=>2) ;
$data[4] = array('itemlist_id'=>168,'item_name'=>'เกลือ','quantity'=>1,'capacity'=>50,'user_id'=>1,'slot_use'=>1) ;

if(is_array($data))
{
	// read from data I
    foreach($data as $row)
    {
		while($row['quantity'] > 0)
		{
			$quantity = ($row['quantity'] > $row['capacity'] ? $row['capacity'] : $row['quantity']  )  ;
			$row['quantity'] -=  $quantity ;
			// insert to data II
			$data2[] = array('itemlist_id'=>$row['itemlist_id'],'item_name'=>$row['item_name'],'quantity'=>$quantity,'capacity'=>$row['capacity'],'user_id'=>$row['user_id'],'slot_use'=>1) ;
			echo  'itemlist_id=>',$row['itemlist_id'],', item_name=>',$row['item_name'],', quantity=>',$quantity,', capacity=>',$row['capacity'],', user_id=>',$row['user_id'],', slot_use=>',1 , "";
		}
    }
}

?>

+ ตัวแปรแบบ dynamic (Dynamic Variables) By tumaji 17 October 2008 at 2:13 am and have No Comments

����������� เนื่องจากผมได้เจอคำถามจากเพื่อนสมาชิกใน board thaiseoboard.com ตั้งคำถามว่า

// read POST variables if present
foreach ($_POST as $name => $value) {�
������ $$name = $value;
}

Script บรรทัดนี้หมายความว่ายังไง ก็เลยเป็นเหตุได้เขียนบทความนี้

������������ ที่เป็นคำถามเพราะว่าเจอตัวแปรที่มี $$ นำหน้า ซึ่งปกติทั่วไปจะเป็น $ อันเดียว ลักษณะที่เป็น $$ �เป็นการสร้างตัวแปรแบบ dynamic �เช่น

$name = 'test' ;
$$name จะหมายถึง $test
การรับค่า $$name = 1 ;
ก็แสดงว่า $test มีค่าเท่ากับ 1

อันนี้น่าจะพอเข้าใจกันแล้ว ทีนี้มาดูจุดมุ่งหมายของ Script นี้

// read POST variables if present
foreach ($_POST as $name => $value) {� // name เป็น index ของ array
������ $$name = $value; // ส่งค่าให้กับตัวแปร
}


จาก script เป็นการแก้ปัญหาการ config register_globals = Off ใน php.ini �ซึ่งค่าจาก form จะอยู่ในรูป $_POST['test'] ,$_GET['test'] ไม่สามารถ เอา $test มาใช้ได้เลยทันที แต่ถ้า register_globals = On จะสามารถใช้ $test ได้เลย
ด้วยเหตุนี้ถ้าไม่สามารถแก้ php.ini ได้(กรณีเช่าโฮสอยู่) ก็มาแก้ที่โปรแกรมโดยการวนลูป� $_POST ซึ่งเป็น array แล้วส่งค่าให้กับตัวแปรตามค่า index ของมันซึ่งค่า index ของมันก็คือชื่อตัวแปรนั้นเอง

ตัวอย่างเช่นใน form มีการส่งค่า username=var1 และ password=var2 มา� ในการรับค่าจาก form จะได้เป็น $_POST[‘username'] และ $_POST[‘password'] �โดยในรูปแบบ array จะเป็น (‘username’=>var1 ,’password’=>var2)

ปล. register_globals = Off� แนะนำให้ใช้เพราะเหตุผลทางด้าน security ครับ อีกตัว magic_quotes_gpc = On ป้องกัน Sql injection ครับ