PHP 修改多维数组以更新值而不是添加到末尾
PHP Modify multidimensional array to update values rather than adding to the end
我需要帮助来修改数组以达到所需的结构。很抱歉示例结构可能很大,但我想更好地展示结构。
我有一个像下面这样的目标数组,我需要生成它
[bf_1040242] => Array
(
[326] => Just some Information. Additional Text
[17565] => Array
(
[0] => 2
[1] => 1
[2] => 3
)
[other] => Array
(
[17565] => Testing
[28623] =>
[42284] => Something Else
)
[597] => 1
[327] => This is some text
[328] => asdasd
[11880] => wwwww
[329] => xxxxx
[28622] => 2
[42283] => 1
[42284] => Array
(
[0] => 2
[1] => 3
[2] => 4
)
我生成此数据的格式不同,其中这些值的结构为字符串。
Array
(
[0] => Array
(
[name] => bf_1040242[326]
[value] => Just some Information. Additional Text
)
[1] => Array
(
[name] => bf_1040242[17565][]
[value] => 2
)
[2] => Array
(
[name] => bf_1040242[17565][]
[value] => 1
)
[3] => Array
(
[name] => bf_1040242[17565][]
[value] => 3
)
[4] => Array
(
[name] => bf_1040242[other][17565]
[value] => Testing
)
[5] => Array
(
[name] => bf_1040242[597]
[value] => 1
)
[6] => Array
(
[name] => bf_1040242[327]
[value] => This is some text
)
[7] => Array
(
[name] => bf_1040242[328]
[value] => asdasd
)
[8] => Array
(
[name] => bf_1040242[11880]
[value] => wwwww
)
[9] => Array
(
[name] => bf_1040242[329]
[value] => xxxxx
)
[10] => Array
(
[name] => bf_1040242[28622]
[value] => 2
)
[11] => Array
(
[name] => bf_1040242[other][28623]
[value] =>
)
[12] => Array
(
[name] => bf_1040242[42283]
[value] => 1
)
[13] => Array
(
[name] => bf_1040242[42284][]
[value] => 2
)
[14] => Array
(
[name] => bf_1040242[42284][]
[value] => 3
)
[15] => Array
(
[name] => bf_1040242[42284][]
[value] => 4
)
[16] => Array
(
[name] => bf_1040242[other][42284]
[value] => Something Else
)
)
在上面的数组中,键'name'代表字符串格式的单个数组结构,'value'保存数组结构需要更新的值。
这是通过使用
成功完成的
$extra = []
foreach ($mainArray as $key => $value)
{
parse_str($value['name'], $tempArr);
$m = $this->multiArr($k, $value);
array_push($extra, $m);
}
protected function multiArr($k, $val)
{
foreach($k as $key => $value)
{
if(is_array($value) ) $k[$key] = $this->multiArr($k[$key], $val);
if(!is_array($value))
{
$k[$key] = (string) $val['value'];
}
}
return $k;
}
$m 保存单独的数组值,如
Array
(
[bf_1040242] => Array
(
[other] => Array
(
[42284] => Something Else
)
)
)
使用这些单独的数组值,我想创建所需的主要数组,所以我使用了
array_push($extra, $m);
但这会将每个 $m 数组添加到彼此下方,而不是按照上面预期的方式更新。
下面是我的结局。
Array
(
[0] => Array
(
[bf_1040242] => Array
(
[326] => Just some Information. Additional Text
)
)
[1] => Array
(
[bf_1040242] => Array
(
[17565] => Array
(
[0] => 2
)
)
)
[2] => Array
(
[bf_1040242] => Array
(
[17565] => Array
(
[0] => 1
)
)
)
[3] => Array
(
[bf_1040242] => Array
(
[17565] => Array
(
[0] => 3
)
)
)
[4] => Array
(
[bf_1040242] => Array
(
[other] => Array
(
[17565] => Testing
)
)
)
[5] => Array
(
[bf_1040242] => Array
(
[597] => 1
)
)
[6] => Array
(
[bf_1040242] => Array
(
[327] => This is some text
)
)
[7] => Array
(
[bf_1040242] => Array
(
[328] => asdasd
)
)
[8] => Array
(
[bf_1040242] => Array
(
[11880] => wwwww
)
)
[9] => Array
(
[bf_1040242] => Array
(
[329] => xxxxx
)
)
[10] => Array
(
[bf_1040242] => Array
(
[28622] => 2
)
)
[11] => Array
(
[bf_1040242] => Array
(
[other] => Array
(
[28623] =>
)
)
)
[12] => Array
(
[bf_1040242] => Array
(
[42283] => 1
)
)
[13] => Array
(
[bf_1040242] => Array
(
[42284] => Array
(
[0] => 2
)
)
)
[14] => Array
(
[bf_1040242] => Array
(
[42284] => Array
(
[0] => 3
)
)
)
[15] => Array
(
[bf_1040242] => Array
(
[42284] => Array
(
[0] => 4
)
)
)
[16] => Array
(
[bf_1040242] => Array
(
[other] => Array
(
[42284] => Something Else
)
)
)
)
我不确定 array_push 是我需要使用的,还是其他的。
另外,有没有更清洁或更有效的方法。
非常感谢任何帮助,谢谢
通常你会为此使用 array_merge_recursive,但它不会保留命名键,所以我写了一个 array_join
函数让生活更轻松:)
function array_join($value, &$result) {
if (!is_array($value)) {
$result = $value;
return;
}
foreach ($value as $k => $v) {
array_join($v, $result[$k]);
}
}
$result = [];
foreach ($mainArray as $entry)
{
parse_str($entry['name'] . '=' . $entry['value'], $nameArray);
array_join($nameArray, $result);
}
我们简单地递归调用array_join直到值不再是数组。注意 array_join
的 &$result
中的 &
。我们传递数组中当前位置的引用。
为了充分利用 parse_str
,我还通过附加 =<value>
添加了值
工作example。
下一个 post 的专业提示。使用 var_export 给我们一个数组,可以将其复制粘贴为代码:)
编辑
更简单的解决方案,带有针对“邪恶”输入的转义值。
foreach ($mainArray as $entry)
{
$stringVarArray[] = $entry['name'] . '=' . urlencode($entry['value']);
}
parse_str(implode('&', $stringVarArray), $result);
var_dump($result);
工作example。
我需要帮助来修改数组以达到所需的结构。很抱歉示例结构可能很大,但我想更好地展示结构。
我有一个像下面这样的目标数组,我需要生成它
[bf_1040242] => Array
(
[326] => Just some Information. Additional Text
[17565] => Array
(
[0] => 2
[1] => 1
[2] => 3
)
[other] => Array
(
[17565] => Testing
[28623] =>
[42284] => Something Else
)
[597] => 1
[327] => This is some text
[328] => asdasd
[11880] => wwwww
[329] => xxxxx
[28622] => 2
[42283] => 1
[42284] => Array
(
[0] => 2
[1] => 3
[2] => 4
)
我生成此数据的格式不同,其中这些值的结构为字符串。
Array
(
[0] => Array
(
[name] => bf_1040242[326]
[value] => Just some Information. Additional Text
)
[1] => Array
(
[name] => bf_1040242[17565][]
[value] => 2
)
[2] => Array
(
[name] => bf_1040242[17565][]
[value] => 1
)
[3] => Array
(
[name] => bf_1040242[17565][]
[value] => 3
)
[4] => Array
(
[name] => bf_1040242[other][17565]
[value] => Testing
)
[5] => Array
(
[name] => bf_1040242[597]
[value] => 1
)
[6] => Array
(
[name] => bf_1040242[327]
[value] => This is some text
)
[7] => Array
(
[name] => bf_1040242[328]
[value] => asdasd
)
[8] => Array
(
[name] => bf_1040242[11880]
[value] => wwwww
)
[9] => Array
(
[name] => bf_1040242[329]
[value] => xxxxx
)
[10] => Array
(
[name] => bf_1040242[28622]
[value] => 2
)
[11] => Array
(
[name] => bf_1040242[other][28623]
[value] =>
)
[12] => Array
(
[name] => bf_1040242[42283]
[value] => 1
)
[13] => Array
(
[name] => bf_1040242[42284][]
[value] => 2
)
[14] => Array
(
[name] => bf_1040242[42284][]
[value] => 3
)
[15] => Array
(
[name] => bf_1040242[42284][]
[value] => 4
)
[16] => Array
(
[name] => bf_1040242[other][42284]
[value] => Something Else
)
)
在上面的数组中,键'name'代表字符串格式的单个数组结构,'value'保存数组结构需要更新的值。
这是通过使用
成功完成的$extra = []
foreach ($mainArray as $key => $value)
{
parse_str($value['name'], $tempArr);
$m = $this->multiArr($k, $value);
array_push($extra, $m);
}
protected function multiArr($k, $val)
{
foreach($k as $key => $value)
{
if(is_array($value) ) $k[$key] = $this->multiArr($k[$key], $val);
if(!is_array($value))
{
$k[$key] = (string) $val['value'];
}
}
return $k;
}
$m 保存单独的数组值,如
Array
(
[bf_1040242] => Array
(
[other] => Array
(
[42284] => Something Else
)
)
)
使用这些单独的数组值,我想创建所需的主要数组,所以我使用了
array_push($extra, $m);
但这会将每个 $m 数组添加到彼此下方,而不是按照上面预期的方式更新。 下面是我的结局。
Array
(
[0] => Array
(
[bf_1040242] => Array
(
[326] => Just some Information. Additional Text
)
)
[1] => Array
(
[bf_1040242] => Array
(
[17565] => Array
(
[0] => 2
)
)
)
[2] => Array
(
[bf_1040242] => Array
(
[17565] => Array
(
[0] => 1
)
)
)
[3] => Array
(
[bf_1040242] => Array
(
[17565] => Array
(
[0] => 3
)
)
)
[4] => Array
(
[bf_1040242] => Array
(
[other] => Array
(
[17565] => Testing
)
)
)
[5] => Array
(
[bf_1040242] => Array
(
[597] => 1
)
)
[6] => Array
(
[bf_1040242] => Array
(
[327] => This is some text
)
)
[7] => Array
(
[bf_1040242] => Array
(
[328] => asdasd
)
)
[8] => Array
(
[bf_1040242] => Array
(
[11880] => wwwww
)
)
[9] => Array
(
[bf_1040242] => Array
(
[329] => xxxxx
)
)
[10] => Array
(
[bf_1040242] => Array
(
[28622] => 2
)
)
[11] => Array
(
[bf_1040242] => Array
(
[other] => Array
(
[28623] =>
)
)
)
[12] => Array
(
[bf_1040242] => Array
(
[42283] => 1
)
)
[13] => Array
(
[bf_1040242] => Array
(
[42284] => Array
(
[0] => 2
)
)
)
[14] => Array
(
[bf_1040242] => Array
(
[42284] => Array
(
[0] => 3
)
)
)
[15] => Array
(
[bf_1040242] => Array
(
[42284] => Array
(
[0] => 4
)
)
)
[16] => Array
(
[bf_1040242] => Array
(
[other] => Array
(
[42284] => Something Else
)
)
)
)
我不确定 array_push 是我需要使用的,还是其他的。 另外,有没有更清洁或更有效的方法。
非常感谢任何帮助,谢谢
通常你会为此使用 array_merge_recursive,但它不会保留命名键,所以我写了一个 array_join
函数让生活更轻松:)
function array_join($value, &$result) {
if (!is_array($value)) {
$result = $value;
return;
}
foreach ($value as $k => $v) {
array_join($v, $result[$k]);
}
}
$result = [];
foreach ($mainArray as $entry)
{
parse_str($entry['name'] . '=' . $entry['value'], $nameArray);
array_join($nameArray, $result);
}
我们简单地递归调用array_join直到值不再是数组。注意 array_join
的 &$result
中的 &
。我们传递数组中当前位置的引用。
为了充分利用 parse_str
,我还通过附加 =<value>
工作example。
下一个 post 的专业提示。使用 var_export 给我们一个数组,可以将其复制粘贴为代码:)
编辑
更简单的解决方案,带有针对“邪恶”输入的转义值。
foreach ($mainArray as $entry)
{
$stringVarArray[] = $entry['name'] . '=' . urlencode($entry['value']);
}
parse_str(implode('&', $stringVarArray), $result);
var_dump($result);
工作example。