在 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
{
"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,临时规避掉引用的变量名重名的问题。
![但是,返回的 $schema ,即 [2023-05-17 09:45:23] local.INFO: v2.1.3_migrate_index.php_schema_1 ,不符合预期。其数据有丢失。在 sections.4imagetext_t0upqwh3 中的字段:type、settings、block_order 等皆已经丢失。](https://www.shuijingwanwq.com/wp-content/uploads/2023/06/1-6.png)
近期评论