我有一个这样的数组:
Array
(
[1] => Array
(
[uris] => Array
(
[1] => /
[2] => /news/
[3] => /about/
[4] => /contact/
)
[templates] => Array
(
[1] => 1
[2] => 2
[3] => 3
[4] => 4
)
)
)
我需要使用一组新值更新所有ID,因此最终输出应该是这样的:
[uris] => Array
(
[100] => /
[101] => /news/
[102] => /about/
[103] => /contact/
)
[templates] => Array
(
[100] => 1
[101] => 2
[102] => 3
[103] => 4
)
我想我可能需要使用像'/(\[.*?\])/'
这样的正则表达式模式,但我不确定如何将它组合在一起以获得最终的更新输出。
编辑:我应该提到我更新的ID不会按顺序排列,它们来自CMS中条目的数据库表。条目正在重复,因此它们具有相同的URI,但第二组具有比原始ID更高的ID集。
第二组ID不会成为规则。唯一的保证是第二组都将高于第一组中的最高ID。
与我合作的CMS允许我复制条目以便在第二个站点上使用。但CMS也使用第三方模块创建一个序列化数组,就像我上面发布的那样,它将URI与模板匹配。当条目重复时,模块不会创建新条目ID的新序列化数组,因此我尝试手动执行此操作。
我以为我可以反序列化数组,使用新条目的相应ID更新字符串的旧ID,将其重新序列化,然后将其复制回数据库。
答案 0 :(得分:3)
Array (
[1] => /
[2] => /news/
[3] => /about/
[4] => /contact/
)
鉴于这种数组,您需要做的就是更换密钥:
$array = array_combine(range(100, 100 + (count($array) - 1)), $array);
它生成密钥[100, .., 103]
并将它们拼接到数组中。
答案 1 :(得分:2)
您可能需要循环然后更换密钥:
foreach ($yourArray as $array) {
for ($i = 0; $i < count($array['uris']); $i++) {
$array['uris'][$i][$newkey] = $array['uris'][$i][$oldkey];
unset($array['uris'][$i][$oldkey]);
}
for ($i = 0; $i < count($array['templates']); $i++) {
$array['templates'][$i][$newkey] = $array['templates'][$i][$oldkey];
unset($array['templates'][$i][$oldkey]);
}
}
答案 2 :(得分:2)
$mainArray = array();
$mainArray[]=array("uris" => array("/", '/news', '/about', '/contact') , "templates" => array(1,2,3,4));
foreach ($mainArray as &$array) {
$uris = $array['uris'];
$keys = array_keys($uris);
for($i=0;$i<count($keys);$i++)
{
$uris[$keys[$i] + 100]=$uris[$i];
unset($uris[$i]);
}
$template = $array['templates'];
$keys = array_keys($uris);
for($i=0;$i<count($keys);$i++)
{
$template[$keys[$i] + 100]=$template[$i];
unset($template[$i]);
}
$array['uris'] = $uris;
$array['templates'] = $template;
}
echo "<pre>";
print_r($mainArray);
exit;
答案 3 :(得分:1)
如果数组值是唯一的,则可以使用array_flip
:
$array = [
1 => '/',
2 => '/contact/',
3 => '/about/'
];
$counter = 100;
$array = array_flip($array);
$array = array_map(function($oldKey) use (&$counter) {
return ++$counter;
}, $array);
$array = array_flip($array);
答案 4 :(得分:1)
试试这个,
$array = array(
array('uris' => array(
'1' => '/',
'2' => '/news/',
'3' => '/about/',
'4' => '/contact/'
),
'templates' => array
(
'1' => '1',
'2' => '2',
'3' => '3',
'4' => '4'
)
)
);
$val = 100;
$result = array();
foreach ($array as $key => $value) {
foreach ($value as $key1 => $value1) {
foreach ($value1 as $key2 => $value2) {
$result[$key][$key1][$val] = $value2;
$val++;
}
}
}
var_dump($result);
答案 5 :(得分:1)
根据您的问题更新;不太确定你要做什么,但我有两个猜测。
arr2d_replace_id
将获取所有uris
并增加密钥以及一组新的数组,其中包含更新的密钥及其值。
arr2d_replace_id2
将1)翻转模板数组 - 我猜测该值代表uris
中的路径ID,因此翻转以保留值; 2)增加uris
上的键值; 3)根据uris
的密钥更改翻转数组的值; 4)用新的设置信息向后翻转数组并分配给结果。
function arr2d_replace_id($arr, $inc) {
$result = array();
foreach ($arr['uris'] as $k=>$v) {
$result['uris'][intval($k) + $inc] = $v;
$result['templates'][intval($k) + $inc] = $arr['templates'][$k];
}
return $result;
}
function arr2d_replace_id2($arr, $inc) {
$result = array();
$tpl_flipped = array_flip($arr['templates']);
foreach ($arr['uris'] as $k=>$v) {
$result['uris'][intval($k) + $inc] = $v;
$tpl_flipped[$k] = intval($k) + $inc;
}
$result['templates'] = array_flip($tpl_flipped);
return $result;
}
$test = array(
'uris' => array(
1 => '/', '/news/', '/about/', '/contact/',
),
'templates' => array(
1 => 1, 2, 3, 4
)
);
print_r( $test );
print_r( arr2d_replace_id($test, 100) );
print_r( arr2d_replace_id2($test, 100) );
请参阅操作:http://3v4l.org/T6hHD