在 Laravel 6 中,基于 数组相关函数 操作数组后,同样的输入,在不同执行顺序下的差异的分析(include、引用)

1、PHP 文件的代码实现如下

<?php

use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Log;

Log::info(
    'v2.1.3_migrate_index.php_schema_0',
    [
        'schema' => $schema
    ]
);

$settings = ['text_color', 'mask_opacity', 'button_text_color', 'button_background_color'];
if (Arr::has($schema, 'sections')) {
    foreach ($schema['sections'] as $sectionKey => $section) {
        if (Arr::get($section, 'type') == 'multi-column') {
            foreach ($settings as $setting) {
                if (Arr::has($section, 'settings.' . $setting)) {
                    if ($setting == 'mask_opacity') {
                        $value = (bool)Arr::get($section, 'settings.' . $setting);
                    } else {
                        $value = Arr::get($section, 'settings.' . $setting);
                    }
                    foreach ($section['blocks'] as $blockKey => $block) {
                        Arr::set($schema, 'sections.' . $sectionKey . '.blocks.' . $blockKey . '.settings.' . $setting, $value);
                    }
                    Arr::forget($schema, 'sections.' . $sectionKey . '.settings.' . $setting);
                }
            }
        }
    }
}

Log::info(
    'v2.1.3_migrate_index.php_schema_1',
    [
        'schema' => $schema
    ]
);

return $schema;

2、初始的 $schema ,即 [2023-05-17 09:45:23] local.INFO: v2.1.3_migrate_index.php_schema_0 ,其值如下

{
  "schema": {
    "sections": {
      "4imagetext_t0upqwh3": {
        "type": "multi-column",
        "disabled": false,
        "settings": {
          "heading": "",
          "heading_align": "center",
          "text_color": "#000",
          "image_size": "auto",
          "mask_opacity": 0,
          "button_text_color": "#000",
          "button_background_color": "#fff",
          "text_align": "center"
        },
        "blocks": {
          "column-0": {
            "type": "column",
            "settings": {
              "heading": "IMAGE WITH TEXT",
              "text": "Use these blocks to share your brand's story. You can focus on a particular collection, a product detail, or even embed a video.",
              "image": "https://cdn.cloudfastin.com/image/cafe2c8e6451a85f66aedbc62af22747f711c3f2.jpeg",
              "mobile_image": "",
              "url": "/",
              "label": "MORE INFO"
            }
          },
          "column-1": {
            "type": "column",
            "settings": {
              "heading": "IMAGE WITH TEXT",
              "text": "Use these blocks to share your brand's story. You can focus on a particular collection, a product detail, or even embed a video.",
              "image": "https://cdn.cloudfastin.com/image/b55803eeb93eba8bb0b8bc4bb4be7ad16df74ad1.jpeg",
              "mobile_image": "",
              "url": "/",
              "label": "MORE INFO"
            }
          },
          "column-2": {
            "type": "column",
            "settings": {
              "heading": "IMAGE WITH TEXT",
              "text": "Use these blocks to share your brand's story. You can focus on a particular collection, a product detail, or even embed a video.",
              "image": "https://cdn.cloudfastin.com/image/083a9e7fbe2b3856aecb84a2387f82eea0bb0f39.jpeg",
              "mobile_image": "",
              "url": "/",
              "label": "MORE INFO"
            }
          }
        },
        "block_order": [
          "column-0",
          "column-1",
          "column-2"
        ]
      }
    },
    "order": [
      "4imagetext_t0upqwh3"
    ]
  }
}

3、但是,返回的 $schema ,即 [2023-05-17 09:45:23] local.INFO: v2.1.3_migrate_index.php_schema_1 ,不符合预期。其数据有丢失。在 sections.4imagetext_t0upqwh3 中的字段:type、settings、block_order 等皆已经丢失。如图1

图1

{
    "schema": {
        "sections": {
            "4imagetext_t0upqwh3": {
                "blocks": {
                    "column-0": {
                        "settings": {
                            "button_background_color": "#fff"
                        }
                    },
                    "column-1": {
                        "settings": {
                            "button_background_color": {
                                "blocks": {
                                    "column-0": {
                                        "settings": {
                                            "button_background_color": "#fff"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "column-2": {
                        "settings": {
                            "button_background_color": {
                                "blocks": {
                                    "column-0": {
                                        "settings": {
                                            "button_background_color": "#fff"
                                        }
                                    },
                                    "column-1": {
                                        "settings": {
                                            "button_background_color": {
                                                "blocks": {
                                                    "column-0": {
                                                        "settings": {
                                                            "button_background_color": "Over 15 levels deep, aborting normalization"
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "order": [
            "4imagetext_t0upqwh3"
        ]
    }
} 

4、但是,仅执行此 PHP 文件,返回的 $schema 是符合预期的。第 3 步骤的执行不符合预期,根源应该在于执行此 PHP 文件之前的某处影响到了这个 PHP 文件的执行。

{
    "schema": {
        "schema": {
            "order": [
                "4imagetext_t0upqwh3"
            ],
            "sections": {
                "4imagetext_t0upqwh3": {
                    "type": "multi-column",
                    "blocks": {
                        "column-0": {
                            "type": "column",
                            "settings": {
                                "url": "/",
                                "text": "Use these blocks to share your brand's story. You can focus on a particular collection, a product detail, or even embed a video.",
                                "image": "https://cdn.cloudfastin.com/image/cafe2c8e6451a85f66aedbc62af22747f711c3f2.jpeg",
                                "label": "MORE INFO",
                                "heading": "IMAGE WITH TEXT",
                                "mobile_image": ""
                            }
                        },
                        "column-1": {
                            "type": "column",
                            "settings": {
                                "url": "/",
                                "text": "Use these blocks to share your brand's story. You can focus on a particular collection, a product detail, or even embed a video.",
                                "image": "https://cdn.cloudfastin.com/image/b55803eeb93eba8bb0b8bc4bb4be7ad16df74ad1.jpeg",
                                "label": "MORE INFO",
                                "heading": "IMAGE WITH TEXT",
                                "mobile_image": ""
                            }
                        },
                        "column-2": {
                            "type": "column",
                            "settings": {
                                "url": "/",
                                "text": "Use these blocks to share your brand's story. You can focus on a particular collection, a product detail, or even embed a video.",
                                "image": "https://cdn.cloudfastin.com/image/083a9e7fbe2b3856aecb84a2387f82eea0bb0f39.jpeg",
                                "label": "MORE INFO",
                                "heading": "IMAGE WITH TEXT",
                                "mobile_image": ""
                            }
                        }
                    },
                    "disabled": false,
                    "settings": {
                        "heading": "",
                        "image_size": "auto",
                        "text_align": "center",
                        "text_color": "#000",
                        "mask_opacity": 0,
                        "heading_align": "center",
                        "button_text_color": "#000",
                        "button_background_color": "#fff"
                    },
                    "block_order": [
                        "column-0",
                        "column-1",
                        "column-2"
                    ]
                }
            }
        }
    }
}

5、最终确认了原因,是因为在执行此 PHP 文件之前,执行了另一个 PHP 文件,在另一个 PHP 文件中使用了引用:&$value。两个 PHP 文件的依次执行是使用的 include 。

<?php

use Illuminate\Support\Arr;

if (Arr::has($schema, 'sections'))
{
    foreach ($schema['sections'] as &$value) {
        // ...
    }
}

return $schema;

6、将 $value 替换为 $sectionSettingValue,临时规避掉引用的变量名重名的问题。

永夜