לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 01-10-2008, 20:04
  dardevil dardevil אינו מחובר  
 
חבר מתאריך: 12.08.05
הודעות: 883
foreach במערך דו מימדי וclassים

ערב טוב ושנה טובה.
האשכול שלי מחולק לשתי שאלות שקשורות אחת בשניה.
א. איך אני שולף נתונים ממסד הנתונים ע"י פונקציה?
אני אסביר, נניח שיש לי טבלה בשם items, ואני רוצה לשלוף ממנה 5 שדות.
אני עשיתי את זה בצורה הבאה:
קוד PHP:
 $query mysql_query("SELECT * FROM items WHERE `member`='$this->id_member'") or die("Query faild: " mysql_error());
   
$i 0;
   while(
$result mysql_fetch_array($query))
   {
    
$items[$i]['id'] = $result['id'];
    
$items[$i]['name'] = $result['name'];
    
$items[$i]['category'] = $result['category'];
      
$i++; 
   }
   return 
$items

וככה בעצם אני יוצא מערך דו מימדי, שהמפתח הראשון ממספר את השדות, והמפתח השני זה שם השדה במסד הנתונים.
רציתי לדעת אם יש דרך יותר טובה לשלוף את הנתונים..
ב. איך אני משתמש בלולאה foreach על מערך דו מימדי, אבל כאשר אני רוצה לעבור רק על המפתח הראשון.
בהמשך לשאלה א', איך אני עובר ע"י foreach רק על הפתח הראשון, כי על המפתח השני(שמות השדות) אני לא צריך לעבור.
כרגע אני משתמש בלולאת for צורה הבאה:
קוד PHP:
 for($i=0;$i<count($results_items);$i++)
      {
echo 
$results_items[$i]['name'];      
            } 

אבל אני מאמין שforeach יהיה הרבה יותר יעיל.
מישהו מכיר את דרך השימוש בה במערך דו מימדי?
תודה רבה!
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #2  
ישן 01-10-2008, 20:23
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 1 שנכתבה על ידי dardevil שמתחילה ב "foreach במערך דו מימדי וclassים"

א':

הצורה שהצגת לשליפת הנתונים כשרה לחלוטין...ואני מניח שזו גם הצורה הטובה ביותר.

רק שים לב שהצורה הבאה של הצבת משתנה במחרוזת:
קוד PHP:
 mysql_query("SELECT * FROM items WHERE `member`='$this->id_member'"


כנראה שלא תעבוד. בכל מקרה, אני מעדיף את השימוש הבא בהצבות משתנים במחרוזות:

קוד PHP:
 mysql_query('SELECT * FROM `items` WHERE `member`='.$this->id_member


ב':
ציטוט:
איך אני משתמש בלולאה foreach על מערך דו מימדי, אבל כאשר אני רוצה לעבור רק על המפתח הראשון.


למה הכוונה?
האם זהו מערך אסוציאטיבי הבנוי ממחרוזות, או מערך הבנוי ממספרים?

אם זה מערך הבנוי ממספרים - לא תצטרך להשתמש בלולאה. פשוט תציב את המספר 1 או המספר 0 (תלוי מה ראשון אצלך..)

אם זה מערך הבנוי ממחרוזות - תוכל להפעיל עליו לולאת foreach ולבצע break בסוף הלולאה, ללא שום תנאי.
לחלופין, תוכל להעזר בשילוב של שתי הפונקציות הבאות:
http://il2.php.net/manual/en/function.reset.php
http://il2.php.net/manual/en/function.current.php

לגבי המשך סעיף ב' אני לא בטוח שהבנתי.
שמות השדות אלו מפתחות השייכים למערך הפנימי (ולא למערך הראשי. כלומר, למערך שנמצא בכל איבר של המערך הראשי.).

איך אתה מגדיר את "המפתח הראשון"?
לאיזה מערך הוא שייך?

ד"א, נכתב פה בפורום בעבר שלולאת for מהירה יותר מלולאת while, וכמובן מלולאת foreach.
למרות שעד עכשיו אני לא יודע למה היא מהירה יותר מ-while ...
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #4  
ישן 01-10-2008, 20:51
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 3 שנכתבה על ידי dardevil שמתחילה ב "תודה על התגובה המהירה! א...."

ציטוט:
במקור נכתב על ידי dardevil
א. אוקיי. אגב זה עובד בדרך שהצגתי את זה. מה היתרון בצורה שאתה הצגת?


ואלה? דוקא חשבתי שזה יתרגם רק את המשתנה ששמו $this ...אולי בגלל היחודיות של שם המשתנה, PHP מתרגם גם את ההמשך של המחרוזת כשם של המשתנה.

אין פה ממש יתרון, זאת פשוט צורת עבודה נוחה יותר ומבחינתי גם בטוחה יותר.
אני רוצה להיות בטוח שהמשתנה הספציפי שאני מציב יתורגם, ולא משתנה אחר ש-PHP בטעות יתרגם בגלל הצבה לא נכונה של המשתנה במחרוזת...
בעידכון גרסאות של PHP, יכול להיות שתישתנה גם אופן התירגום של שם המשתנה במחרוזת.
סיבה אחרת זה שהמשתנה מאוד בולט כאשר עורכים את הקוד עם תוכנת עריכה מתקדמת (שצובעת את הקוד...).

זה אופי מחשבה של פרפקטציוניסט...

ציטוט:
במקור נכתב על ידי dardevil
ב. אני מתכוון בדיוק למערך שחלק א' בנה.
ה$i(המפתח הראשון) ממספר את השדות, והמפתח השני הוא שם השדה במסד(id,name)
אם למשל אני ארצה להציג את השם של התוצאה השלישית במערך, אני אכתוב את הקוד הזה:
קוד PHP:
 echo $items[3]['name']; 

על המפתח שני, שבעצם מורכב ממחרוזת, אני לא צריך לעבור כי אותו אני רוצה להציג לפי הקוד שלי.
אבל על המפתח הראשון, שבעצם מיספר את התוצאות, אני כן רוצה לעבור כי אני רוצה להציג את כל התוצאות מהמסד.


לולאת for תספיק, בתנאי שאתה בטוח שמפתחות המערך הם מספרים רציפים (כלומר, שכל המספרים בטווח מסויים קיימים. לדוגמא, שלא יהיה מצב שמפתח מספר 2 לא קיים, אבל מספר 3 כן קיים.)
אחרת תשתמש בלולאת foreach שהיא בטוחה יותר מהבחינה הנ"ל.

הרי למערכים הפנימיים שנמצאים בתוך המערך הראשי אתה יודע את שמות כל המפתחות, לכן זה יהיה מיותר במקרה שלך להריץ לולאת foreach על המערכים הפנימיים, במיוחד כשיכול להיות שתצטרך פה דינאמיות עם המשתנים.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #5  
ישן 01-10-2008, 22:04
  dardevil dardevil אינו מחובר  
 
חבר מתאריך: 12.08.05
הודעות: 883
בתגובה להודעה מספר 4 שנכתבה על ידי dorM שמתחילה ב "[QUOTE=dardevil] א. אוקיי...."

אני מבין.
מבחינת העורך טקסט זה לא משנה, כי אני כותב בphpdesigner ושם גם אם אתה שם משתנה בתוך מרכאות, הוא צובע לו את הרקע באדום כדי שתדע להבחין בין המשתנה שאר המחרוזת(אגב, בהזדמנות זו אני מצרף את המלצתי החמה על העורך הזה, הוא מעולה!)

המספרים תמיד יהיו רציפים כי את המערך אני יוצר בפונקציה מסעיף א'.
נכון. בגלל זה רציתי לדעת אם יש אפשרות בforeach לעבור רק על המפתח הראשון.

אם כבר פתחתי דיון על תכנות מונחה עצמים, אז יש לי עוד שאלה.
כשאני רוצה להשתמש במשתנה כללי לכל הclass אני משתמש ב$this->var.
אבל מה קורה אם אני רוצה להשתמש במשתנה שהצבתי בclass אחר? ניסיתי להחליף את המשתנה this בשם של הclass אבל זה לא עובד.
הורשה לא נראת לי ממש קשורה, וכל דבר אחר לא מצליח לי.
יש בכלל כזאת אפשרות?
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #8  
ישן 02-10-2008, 03:27
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 7 שנכתבה על ידי dardevil שמתחילה ב "אני התכוונתי לשימוש במשתנה..."

הממ כן...

זה אפשרי אבל השאלה היא איך אתה מממש את זה כרגע (כדי שלא תצטרך לעשות שינויים.)

כי זה תלוי אם לקחת instance חדש של המחלקה a, או שזה reference אל המחלקה (כאשר כתבת פקודת new )

אם זה reference, אז תצטרך פשוט לכתוב:
קוד PHP:
 a:$number 


ואז תוכל להתייחס למשתנה כמו שצריך, גם אם שינו את ערכו.

ד"א, מומלץ להיפטר מהמילה var ולהתחיל להשתמש במילים כמו public, protected ו-private.

אבל אם לקחת instance חדש של המחלקה, תצטרך להוסיף את הפונקציה הבאה למחלקה של a
קוד PHP:
 public function __construct() {
        
a::$number =& $this->number;
    } 

לא ניסיתי את הקוד הנ"ל אבל מבחינה תאורטית הוא אמור לעבוד.

ואז בשתי השיטות הנ"ל תכתוב פשוט:
קוד PHP:
 a:$number 

ותוכל להגיע למשתנה number במחלקה של a
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #10  
ישן 02-10-2008, 13:14
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 9 שנכתבה על ידי dardevil שמתחילה ב "סליחה על הבורות, אבל מה זה..."

ציטוט:
סליחה על הבורות, אבל מה זה instance ומה זה reference?

instance זה כאשר אתה לוקח דוגמה מדויקת של מחלקה, העתק.
לדוגמא:
קוד PHP:
 class /*...*/ }

$a_first_instance = new a;
$a_second_instance = new a;
// and so on... 


קרא כאן עוד: http://www.php.net/manual/en/language.oop5.basic.php תגיע לכותרת "new" בערך ברבע העמוד.

reference זה ייחוס אל המחלקה או האובייקט (שיכול להיות גם משתנה).
הסבר מפורט תוכל למצוא כאן: http://www.php.net/manual/en/language.references.php

ציטוט:
אתה בטוח שאמור להיות רק סימן אחד של נקודותיים? כי כשאני כותב אותו ככה מופיעה לי שגיאת syntax.


צודק.
בגלל חוסר התירגול (והצורך) שלי בשימוש בנקודתיים, בטעות כתבתי אותם פעם אחת במקום פעמיים.

ציטוט:
אבל אם אני מחליף אותו בקוד שאתה הבאת:

קוד PHP:
 a::$number =& $this->number


אז מופיעה לי שגיאת הAccess.


אני לא בטוח למה זה קורה.
הגדרת את משתנה המחלקה number$ שיהיה בעל הרשאת public?
תוריד את המילה var שמקדימה אותו, ותיתן לו public. אני חושב שהמילה var לא תיתמך בגירסאות מתקדמות של PHP.

ציטוט:
אגב, מה הסימן =& מציין?


זה ה-reference = ייחוס, מה שכתבתי עליו למעלה.
כאן יש ייחוס לאובייקט במחלקה.
פעולת הייחוס למעשה "אומרת" ל-PHP שכל שינוי שיתבצע באחד מהמשתנים הקשורים לייחוס, יתבצע גם במשתנה השני.
אם אתה יודע תיכנות ב-C, אז זה די דומה (אבל לא לגמרי) למצב בו יש 2 מצביעים על אותו מקום בזיכרון. ולכן אם תשנה את המידע במקום שעליו הם מצביעים, זה ישתנה אצל כל המצביעים שמצביעים למקום הזה בזיכרון.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #16  
ישן 02-10-2008, 22:12
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 15 שנכתבה על ידי dardevil שמתחילה ב "חבל. זה בסדר, זה כבר עובד לי..."

מצאתי את הדרך הנכונה.

תריץ את הקוד הבא:

קוד PHP:
<?php
class Foo
{
    public static 
$my_static 'Bye School!';

    public function 
set_my_static() {
        
// Reference self::$my_static (through an instance call) to the instance's $my_static variable
        
$this->my_static =& self::$my_static;
    }

    public function 
setValue($newValue) {
        
$this->my_static $newValue;
    }

    public function 
my_static_Status() {
        
var_dump(self::$my_static);
        echo 
'<br />';
    }
}

class 
Bar
{
    public function 
output_Foo_my_static() {
        echo 
'<br />'.Foo::$my_static.'<br />';
    }
}


$foo = new Foo();

$foo->set_my_static();

Bar::output_Foo_my_static();    // Outputs: "Bye School!"

$foo->setValue('Hello World!');

Bar::output_Foo_my_static();    // Outputs: "Hello World!"

echo Foo::$my_static;    // Outputs: "Hello World!"

$Bar = new Bar;

$Bar->output_Foo_my_static();    // Outputs: "Hello World!"

?>


ותנסה להבין אותו.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #18  
ישן 07-10-2008, 18:00
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 17 שנכתבה על ידי dardevil שמתחילה ב "זה עובד!!!! איזה יופי! אבל..."

ציטוט:
א. מה הרעיון שעומד מאחורי הstatic שהכנסת למשתנה?(מה בעצם static עושה?)


מילת המפתח static מאפשרת התייחסות אל האובייקט\משתנה בעזרת האופרטור פעמיים-נקודותיים ( :: ) וציון שם המחלקה (שזה בדיוק מה שאתה רוצה לעשות).
כלומר, static מאפשרת לכתוב:
קוד:
myClassName::$MyVar;


בלי שתיגרם שגיאה ע"י PHP.

ציטוט:
ב. אני חייב את השורה הזאת?:
קוד PHP:
$this->my_static =& self::$my_static;

אני לא יכול פשוט להציב את המשתנה שאני מקבל מהקוד, בלי לכתוב את הself?
ז"א ישר להתחיל עם הפונקציה setValue.. אפשרי?


אתה חייב את השורה הזאת, אבל אפשר להציב בפונקציה __construct() כדי שלא תצטרך להריץ סתם עוד פונקציה.

כלומר, אתה יכול להוסיף למחלקה:

קוד:
function __construct() { $this->my_static =& self::$my_static; }


אתה חייב את השורה הנ"ל ואסביר לך מדוע.
self::$my_static זה משתנה שונה ונפרד מהמשתנה this->my_static$
אל המשתנה self::$my_static אתה מתייחס בהקשר של static.
אל המשתנה this->my_static$ אתה מתייחס בהקשר של אובייקט ( שיצרת עם פקודת new ).

שים לב שכאשר תכתוב:
קוד PHP:
 class myClass
{
    public static 
myVar;
    public 
myVar;



זה יוציא לך שגיאה, לא יודע למה.
זה הדבר היחידי שלא הצלחתי להבין - למה כאשר אני מצהיר על המשתנה this->my_static$ בפונקציית __construct() לדוגמא, זה עובד טוב, אבל כאשר אני מצהיר עליו כמשתנה מחלקה בצורה הרגילה, זה מוציא שגיאה...

בכל אופן, כפי שאמרתי, המשתנה self::$my_static והמשתנה $this->my_static הם שונים, ולכן אתה חייב לעשות ייחוס reference, כדי שאם תשנה את אחד המשתנים, גם השני ישתנה.

הייתי אומר לך להשתמש בפונקציות Overloading (מה שמיקל במקרה זה), אבל זה זמין מגרסא 5.1 ומעלה, ואין אותה בכל שרת... אם תרצה לקרוא בכל זאת: http://il2.php.net/language.oop5.overloading
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 21:00

הדף נוצר ב 0.08 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2025 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר