שרשור פרמטרים של array בקוד php
-
הקדמה:
כהמשך לכאן, שכתבתי שאני רוצה לעשות תיקיות, עכשיו אני עובד לסדר את התיקיות במבנה עץ.
הרעיון שכל תיקיה (על כל מרכיביה ואלמנטיה) ,צריכה להיכנס למערך במקום שלה. זאת אומרת שאם יש שורש עם 5 תיקיות, ויש לי 5 מערכים של תיקיות, אז אני צריך להכניס את כל מערך למקום שלו בתוך השורש. וכן הלאה- לכל תיקיה יש את תיקיותיה.
לכן, כדי להכניס את התיקיות -ענפים - למקומם, עשיתי קוד שמשרשר את המיקום היחסי של התיקיה. לדוגמא, לכל תיקיה יש את רכיב שהוא השם שלה, ועוד רכיב בשם objects שבו יכנסו הצאצאים. לדוגמא, יש את ROOT, ויש לו אלמנט objects, שבו יכנסו FOLDERa וגם FOLDERb. וכדי להכניס את תיקיה FOLDERb לתוך המיקום שלו בroot.object.foldera יצרתי אלמנט לדוגמא בשם $root ושרשרתי את היורשים, ככה:$root['Objects']['foldera']
וכדי שאני יוכל לעשות ככה לכל הקבצים, אז הייתי צריך לעשות פונקציה שתוציא לי סטרינג שמייצג את הנתיבים (לכל התיקיות) מROOT עד לרצוי.
הבעיה, שאני לא מצליח להצמיד את הנתיב ל$ROOT.תודה מראש.
-
-
@dovid אמר בשרשור פרמטרים של array בקוד php:
תרא
הבעיה שהקוד הוא ענק, ולא ניתן להציג את כולו במסגרת הזאת (אולי אם יש משהו תואם ל-JSFIDDLE ל-PHP?).
בכל אופן, אנסה להציג ככה:
אני צריך להזין שRRAY לתוך איברים ב-ARRAY. במקרה הקלאסי כותבים ככה:$root['Objects'] = ARRAY(.....)
כשהמערך שנכנס הוא תוכן תיקיה כל שהיא.
אבל כיון שאני צריך להזין את התיקיה למיקום ספציפי בתוך הARRAY הקיים, וזה יכול להיות גם תיקיה בדור 3 או 4, אז אני מעדכן ככה:$root['Objects']['foldera'] = ARRAY(.....)
עכשיו, זה עוד מצויין כשאני מגדיר את הנתיב ($root['Objects']['foldera']) ידנית, אבל כיון שהתיקיות הם רבות אז אני צריך לעשות פונקציה שתביא לי את הנתיב הנכון, כמו
$root['Objects']['foldera'] $root['Objects']['folderb']
והבעיה שכשאני עושה פונקציה, אני מקבל שגיאה בנוסח
Notice: Undefined variable: $root['Objects']['foldera'] in /var/www/html/folders.php on line 177
(זה לא יעזור לי ליצור את המשתנה ע"י (IF(ISSET כי אני צריך גישה למשנה קיים במערך, השאלה איך ניגשים אליו.
נ.ב. אני מוכרח לציין שהצורה היחידה שהצלחתי לשרשר את הפונקציה היתה ככה:
${'root' . $this->get_string_peremeters_folders()}
תודה רבה
(נ.ב מתסכל זה כשאתה לא עושה טעות והבאג הוא בקוד, לא כשאתה כתבת לא נכון ולכן לא הבינו אותך).
-
שתי דברים:
א. הקוד שלי לא יעיל, בPHP צריך תמיד להחזיר מהפונקציה אובייקט ואיתו להשתמש הלאה.
ב. דיברתי עם חבר והוא טען בצדק שהרבה יותר הגיוני להשתמש עם רקורסיה, תוך כדי מעבר על התיקיה להוסיף למערך. ככה גם לא צריך לבדוק בכלל עם האיבר קיים. זה גדול עלי וגם האונליין לא ייתן לי לעבור על תיקיה כנראה. -
גם אני תפסתי בסופו של דבר (כי מישהו הסביר לי..) שהבעיה היא שהמנוע של PHP קורא את הכל כסטרינג אחד במקום לפצל את הכל לאיברים.
מה שאומר שצריך לעשות את הרקורציה מתוך הפונקציה ולהצמיד את האיברים ל$ROOT.
הבעיה שלא ידוע לי אפשרות לשרשר בצורה מותנית את האיברים לפונקציה. כי דבר בסגנון כזה,$root . if(iseet(roldera)){['foldera']} . if(iseet(rolderb)){['folderb']};
לא הצלחתי לבצע.
@dovid אמר בשרשור פרמטרים של array בקוד php:
ב. דיברתי עם חבר והוא טען בצדק שהרבה יותר הגיוני להשתמש עם רקורסיה, תוך כדי מעבר על התיקיה להוסיף למערך
אם הבנתי את כוונתך, אז כאן צריך להתחיל מכל הענפים הקטנים, ליצור מהם מערכים ולשרשר אותם אחד אחד עד שמחברים את כולם לגזע. אולי זה הדרך, אבל זה הדבר ש'לא בעדיפות ראשונה'.
-
(כתבתי ב-3 חלקים כיון שהוא לא נתן לי לכתוב פוסט ארו יותר מ-100 תוים)
לא מדובר על קבצים ותיקיות אמיתיים ולכן המבנה של קבלת הנתיב הוא לא בהכרח בסגנון home/dovid/dagim/.
הפונקציה שעשיתי נותנת לי סטרינג במבנה
$root['Objects']['foldera']
וכמו שכתבתי התברר שהבעיה היא שהPHP צריך לקבל אובייקטים ולא סטרינג, לכן הוא נתן את השגיאה הנ"ל, בשונה מהמקרה בו הבאתי לו את הנתיב בלי פונקציה, שאז הוא קיבל את זה מצויין, בגלל שהיה לו אובייקטים ממשיים. (המשתנה $root ושתי אובייקטי המשנה שאחריו).
-
@dovid אמר בשרשור פרמטרים של array בקוד php:
ב. דיברתי עם חבר והוא טען בצדק שהרבה יותר הגיוני להשתמש עם רקורסיה, תוך כדי מעבר על התיקיה להוסיף למערך
מישהו ניסה לעזור לי, ונתן לי פונקציה זו, (ואולי התכוונת גם אתה ללולאה בסגנון כזה). בפועל הפתרון שלו לא עונה על הבעיה, כיון שזו צורה רק לגשת למערך, ולא להכניס אחר כך את המערך לאובייקט המקורי (שבשביל זה צריך לבצע פעולת השמה נוספת לתיקיה זו לתוך תיקיית האב ואח"כ אותה גם כן לסב, כשכל פעולה צריכה להריץ כל כל הפונקציה (ברמה שלה)), ונראה לי שגם אם זה אפשרי אבל לא זו הדרך הנכונה.
-
חשבתי על 2 כיוונים לפתרון, את הראשונה לא הצלחתי ליישם, והשניה אולי אעשה אותה אם אין פתרון אמיתי,
הראשונה: לעשות פונקציה שתשלח לי את האובייקטים כאובייקטים אמיתיים, משהו בסגנון של זה
$$root = $root; $$root += "['objects']"; $$root += "['foldera']"; return $$root;
בינתיים אני מקבל שגיאה
Uncaught Error: Unsupported operand
והשניה: להשתמש בספריה הזו, ובאמת לשלוח סטרינג. מקוה שזה ילך
https://github.com/adbario/php-dot-notation
https://packagist.org/packages/adbario/php-dot-notationושוב תודה על העזרה וההשקעה.
-
בפעם האלף @chagold, אין אופציה לעזור כל עוד אתה לא פורש תמונה נורמלי.
אין לי מושג מה הקלט שלך ומה הפלט הרצוי, אתה נמצא ב"אמצע" - הסתדרת למחצה ואתה מבקש עזרה בנקודה בה אתה נתקע. למשל יש לך פונקציה שמייצרת סטרינג $root['Objects']['foldera'], שזו פונקציה מיותרת ובלתי שימושית.
אז אתה חפץ להפוך את הסטרינג לייצוג האמיתי שלו בPHP, חבל! קח את הקלט המקורי - ואותו תהפוך לאובייקט מקונן למשל ע"י הקוד שהראתי.
הקוד האחרון שלך הוא בכיוון אבל הוא עם הרבה העדר ידע בPHP ועם יותר רצון להצליח נקודתית מאשר ללמוד.