דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. References ב-PHP

References ב-PHP

מתוזמן נעוץ נעול הועבר תכנות
42 פוסטים 7 כותבים 985 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • ח מנותק
    ח מנותק
    חוקר
    השיב לdovid ב נערך לאחרונה על ידי חוקר
    #33

    @dovid אמר בReferences ב-PHP:

    @חוקר אני בחיים לא צריך את הפונקציה הזאת...

    לפני

                        if (!myData.ExtraMessageReadingConfirmation[ProjectID]){
                            myData.ExtraMessageReadingConfirmation[ProjectID] = {};
                        }
                        if (!myData.ExtraMessageReadingConfirmation[ProjectID][messageId1]){
                            myData.ExtraMessageReadingConfirmation[ProjectID][messageId1] = {};
                        }
                        if (!myData.ExtraMessageReadingConfirmation[ProjectID][messageId1][userId]){
                            myData.ExtraMessageReadingConfirmation[ProjectID][messageId1][userId] = {};
                        }
                        myData.ExtraMessageReadingConfirmation[ProjectID][messageId1][userId]['np'] = 1;
    

    אחרי

    __.setDescendantProp(myData.ExtraMessageReadingConfirmation, ProjectID + '.' + messageId1 + '.' + userId + '.' + 'np', 1);
    

    בצורת העבודה שלי יש לי המון אובייקטים שמכילים תתי אבוייקטים ותתי תתי וכו'.
    לפני הפונקציה הייתי משתגע איך אני מגדיר ערך לאובייקט שאני לא יודע אם כבר קיים הנתיב שלו דהיינו תתי/תתי תתי/תתי תתי תתי
    אם אגדיר אותו ישירות אקבל שגיאה שלא ניתן להגדיר ערך ל undefined.
    באמצעות הפונקציה הנ"ל ששידרגתי אותה לצורה כזו:

         setDescendantProp : function (obj, desc, value) {
             if (!desc){return obj = value;}
             let arr = desc.split('.');
             while (arr.length > 1) {
                 let shift = arr.shift();
                 if (typeof obj[shift] === 'undefined'){obj[shift] = {}}
                  obj = obj[shift];
                 if (typeof obj[arr[0]] === 'undefined' && arr.length > 1){obj[arr[0]] = {}}
             }
             return obj[arr[0]] = value;
        },
    

    אני מגדיר בקלות את הנתיב המלא, ומזין את הערך הנדרש באובייקט המקורי - הגלובאלי

    dovidD תגובה 1 תגובה אחרונה
    2
    • ח מנותק
      ח מנותק
      חוקר
      כתב ב נערך לאחרונה על ידי חוקר
      #34

      להלן הסט המלא בשיטה זו:

          getDescendantProp : function (obj, desc, returnByUndefined = false) {
              if (!desc){return obj;}
              let arr = desc.split('.');
              while (arr.length && obj !== undefined) {
                  obj = obj[arr.shift()];
              }
              return obj;
          },
      
           setDescendantProp : function (obj, desc, value) {
               if (!desc){return obj = value;}
               let arr = desc.split('.');
               while (arr.length > 1) {
                   let shift = arr.shift();
                   if (typeof obj[shift] === 'undefined'){obj[shift] = {}}
                    obj = obj[shift];
                   if (typeof obj[arr[0]] === 'undefined' && arr.length > 1){obj[arr[0]] = {}}
               }
               return obj[arr[0]] = value;
          },
      
          addDescendantProp : function (obj, desc, value) {
               if (!desc){return obj = value;}
               let arr = desc.split('.');
               while (arr.length > 1) {
                   let shift = arr.shift();
                   if (typeof obj[shift] === 'undefined'){obj[shift] = {}}
                    obj = obj[shift];
                   if (typeof obj[arr[0]] === 'undefined' && arr.length > 1){obj[arr[0]] = {}}
               }
               if (!obj[arr[0]]){
                   obj[arr[0]] = 0;
               }
               return obj[arr[0]] += value;
          },
      
          addPlusDescendantProp : function (obj, desc) {
               if (!desc){ if (!obj) {obj = 0} else {obj++} return obj}
               let arr = desc.split('.');
               while (arr.length > 1) {
                   let shift = arr.shift();
                   if (typeof obj[shift] === 'undefined'){obj[shift] = {}}
                    obj = obj[shift];
                   if (typeof obj[arr[0]] === 'undefined' && arr.length > 1){obj[arr[0]] = {}}
               }
               if (!obj[arr[0]]){
                   obj[arr[0]] = 0;
               }
              obj[arr[0]] = parseInt(obj[arr[0]]);
               return obj[arr[0]]++;
          },
      
          addPropertyDescendantProp : function (obj, desc, key, value) {
               if (!desc){return obj = value;}
               let arr = desc.split('.');
               while (arr.length > 1) {
                   let shift = arr.shift();
                   if (typeof obj[shift] === 'undefined'){obj[shift] = {}}
                    obj = obj[shift];
                   if (typeof obj[arr[0]] === 'undefined' && arr.length > 1){obj[arr[0]] = {}}
               }
               if (!obj[arr[0]]){
                   obj[arr[0]] = {};
               }
              obj[arr[0]][key] = value;
               return obj[arr[0]];
          },
      
           delDescendantProp : function (obj, desc) {
               if (!desc){return obj = value;}
               let arr = desc.split('.');
               while (arr.length > 1) {
                   obj = obj[arr.shift()];
                   if (typeof obj[arr[0]] === 'undefined' && arr.length > 1){obj[arr[0]] = {}}
               }
               return delete obj[arr[0]];
          },
      
      

      דוגמאות שימוש:

      //הוספת סכום למשתנה שאינו בטוח קיים
      __.addDescendantProp(myData.IncomingCallMinutes, ApiDID + '.' + moment().format('YYYYMMDD'),  duration);
      
      //הוספת ++ למשתנה שלא בטוח שהוא קיים
      let countIp = __.addPlusDescendantProp(myData.ipBlocked, clientIp + '.' + 'count');
                                              
      //הוספת איבר והצבת ערך לאיבר, על משתנה שלא בטוח שהוא קיים
      __.addPropertyDescendantProp(id_data['Butza']['Mishnaiot'], seder_key +'.' + masecet_key +'.' + perek_key, i, [perek_obj['r' + i], __.getDescendantProp(myData.QuestionsAndAnswersMishnaiot, ProjectID + '.' + seder_key + '.' + masecet_key + '.' + perek_key + '.' + i + '.QValid') === parseInt(perek_obj['r' + i])])
      
      //מחיקת איבר פנימי                                        
      __.delDescendantProp(myData.QuestionsById, ProjectID + '.' + SelectedTrivia['id'] );
      yossizY תגובה 1 תגובה אחרונה
      1
      • dovidD מחובר
        dovidD מחובר
        dovid ניהול
        השיב לחוקר ב נערך לאחרונה על ידי
        #35

        @חוקר

        לא יודע למה הארכת, חשבת שלא הבנתי מה עושה הפונקציה?
        סה"כ התכוונתי להדגיש את העובדה ש:

        בצורת העבודה שלי

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

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        ח תגובה 1 תגובה אחרונה
        2
        • yossizY מנותק
          yossizY מנותק
          yossiz
          השיב לחוקר ב נערך לאחרונה על ידי
          #36

          @חוקר אם תשתמש בספריית lodash, יש להם פונקציה שעושה את זה.
          יש גם פונקציה הפוכה לקבל מאפיין מקונן כאשר אתה לא בטוח שחלק מהנתיב קיים.
          אגב, זה משהו שנפתר לאחרונה עם הפיצ'ר החדש ב-JS של optional chaining

          @dovid לא ברור לי איך מייתרים את הצורך בפונקציה כזאת במצבים מסויימים.
          למעשה אני לא מצליח להיזכר בפעם האחרונה שהשתמשתי ב-lodash.set, כנראה שהקוד שלי בד"כ מתוכנן בצורה שלא צריך אותו. אבל אני יכול להבין שיש מצבים שחייבים את זה.

          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

          תגובה 1 תגובה אחרונה
          4
          • yossizY מנותק
            yossizY מנותק
            yossiz
            השיב לחוקר ב נערך לאחרונה על ידי yossiz
            #37

            @חוקר אמר בReferences ב-PHP:

            אבל אציין דוגמא של משהו שאולי זה חלק מהכוונה של @yossiz

            בדיוק למקרה כזה משתמשים ב-reference ב-PHP.

            דהיינו כשעושים foreach, הוא לא מעביר לי את האיבר האמיתי המקורי, אלא איבר משוכפל, ששינוי בו אינו משנה כלום באיבר המקורי, ב JS לעומת זאת ניתן להעביר משתנים אפילו לפונקציות שהן משנות את האיבר המקורי.

            רק לדייק בדברים:
            ב-PHP יש 6 סוגים (נפוצים) של ערכים (ועוד 4 פחות נפוצים):

            • bool
            • int
            • float
            • string
            • array
            • object

            מתוכם, ה-5 הראשונים הם value types כלומר (אני מפשיט קצת) שהמשתנה מכיל את הערך, והשמה למשתנה חדש מעתיק את הערך.
            אבל object הוא reference type. כלומר שהמשתנה מכיל מצביע לערך. השמה למשתנה חדש תעתיק רק את המצביע ולא את הערך עצמו.

            זה מה שגורם ל"בעיה" שאתה מציין

            ב-JS יש 4 סוגי ערכים נפוצים:

            • Boolean
            • String
            • Number
            • Object

            ל-object יש המון צאצאים.
            שלושת הראשונים הם value types והאחרון הוא reference type.

            📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

            תגובה 1 תגובה אחרונה
            2
            • ח מנותק
              ח מנותק
              חוקר
              השיב לdovid ב נערך לאחרונה על ידי
              #38

              @dovid אמר בReferences ב-PHP:

              חשבת שלא הבנתי מה עושה הפונקציה

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

              תגובה 1 תגובה אחרונה
              0
              • dovidD מחובר
                dovidD מחובר
                dovid ניהול
                כתב ב נערך לאחרונה על ידי
                #39

                @yossiz אמר בReferences ב-PHP:

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

                אתה חושב שאני לא? אני רק מנסה לעזור. לסנגר לא יעזור למישהו.

                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                תגובה 1 תגובה אחרונה
                1
                • WWWW מנותק
                  WWWW מנותק
                  WWW
                  השיב לחוקר ב נערך לאחרונה על ידי
                  #40

                  @חוקר אמר בReferences ב-PHP:

                  במקרה זה, היה לי מערך שעלי היה להוסיף נתונים לאיברים, ולקבל מערך חדש הכולל את האיברים.
                  אם זה היה כמו ב JS למשל הייתי עושה זאת פשוט יותר:

                  @yossiz ענה לך מצוין:

                  @yossiz אמר בReferences ב-PHP:

                  בדיוק למקרה כזה משתמשים ב-reference ב-PHP.

                  תחליף את הקוד ל:

                  foreach ($rows as &$row){
                  

                  זה לא מסתדר?

                  WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

                  yossizY תגובה 1 תגובה אחרונה
                  3
                  • yossizY מנותק
                    yossizY מנותק
                    yossiz
                    השיב לWWW ב נערך לאחרונה על ידי
                    #41

                    @www אמר בReferences ב-PHP:

                    תחליף את הקוד ל:
                    foreach ($rows as &$row){

                    זה לא מסתדר?

                    אבל יש כאן בעיה שצריך לשים לב אליה. מה ש-@nigun הזכיר למעלה, שב-PHP לולאת foreach לא יוצרת scope נפרד, ולכן המשתנה ‎$row נשארת אחרי הלולאה מצביעה על האיבר האחרון של ה-array. שימוש חוזר בשם המשתנה תעשה דברים לא צפויים...

                    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                    WWWW תגובה 1 תגובה אחרונה
                    4
                    • WWWW מנותק
                      WWWW מנותק
                      WWW
                      השיב לyossiz ב נערך לאחרונה על ידי
                      #42

                      @yossiz אמר בReferences ב-PHP:

                      אבל יש כאן בעיה שצריך לשים לב אליה. מה ש-@nigun הזכיר למעלה, שב-PHP לולאת foreach לא יוצרת scope נפרד, ולכן המשתנה ‎$row נשארת אחרי הלולאה מצביעה על האיבר האחרון של ה-array. שימוש חוזר בשם המשתנה תעשה דברים לא צפויים...

                      זו בעיה שאפשר לפתור אותה בקלות. וגם בד"כ באמת לא אמורים להשתמש שוב באותו שם משתנה.

                      WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

                      תגובה 1 תגובה אחרונה
                      1
                      • yossizY yossiz התייחס לנושא זה ב

                      • 1
                      • 2
                      • 3
                      בא תתחבר לדף היומי!
                      • התחברות

                      • אין לך חשבון עדיין? הרשמה

                      • התחברו או הירשמו כדי לחפש.
                      • פוסט ראשון
                        פוסט אחרון
                      0
                      • דף הבית
                      • קטגוריות
                      • פוסטים אחרונים
                      • משתמשים
                      • חיפוש
                      • חוקי הפורום