用 PHP 替换数组中的 ID
Replace IDs inside array with PHP
我有一个这样的数组:
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 不会按顺序排列,它们来自条目的数据库 table在 CMS 中。条目被复制,因此它们将具有相同的 URI,但第二组具有比原始条目更多的 ID。
第二组 ID 没有规则。唯一的保证是第二组的 ID 都将高于第一组的最高 ID。
我使用的 CMS 允许我复制条目以在第二个站点上使用。但是 CMS 还使用第三方模块创建一个序列化数组,就像我在上面发布的那样,将 URI 与模板相匹配。当条目重复时,该模块不会创建新条目 ID 的新序列化数组,所以我想手动做什么。
我想我可以反序列化数组,用新条目的相应 ID 更新字符串的旧 ID,重新序列化它,然后将它复制回数据库。
您可能必须循环然后替换密钥:
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]);
}
}
Array (
[1] => /
[2] => /news/
[3] => /about/
[4] => /contact/
)
给定这种数组,你需要做的就是替换键:
$array = array_combine(range(100, 100 + (count($array) - 1)), $array);
它生成键[100, .., 103]
并将它们拼接成数组。
如果数组值是唯一的,可以使用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);
$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;
试试这个,
$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);
根据您的问题更新;不太确定你要做什么,但我有两个猜测。
arr2d_replace_id
将采用所有 uris
并增加键以及一组具有更新键及其值的新数组。
arr2d_replace_id2
将 1) 翻转模板数组 - 我猜测其中的值代表 uris
中的路由 ID,因此翻转以保留值; 2) 增加 uris
上的键值; 3) 根据uris
的key改变翻转数组的值; 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
我有一个这样的数组:
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 不会按顺序排列,它们来自条目的数据库 table在 CMS 中。条目被复制,因此它们将具有相同的 URI,但第二组具有比原始条目更多的 ID。
第二组 ID 没有规则。唯一的保证是第二组的 ID 都将高于第一组的最高 ID。
我使用的 CMS 允许我复制条目以在第二个站点上使用。但是 CMS 还使用第三方模块创建一个序列化数组,就像我在上面发布的那样,将 URI 与模板相匹配。当条目重复时,该模块不会创建新条目 ID 的新序列化数组,所以我想手动做什么。
我想我可以反序列化数组,用新条目的相应 ID 更新字符串的旧 ID,重新序列化它,然后将它复制回数据库。
您可能必须循环然后替换密钥:
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]);
}
}
Array (
[1] => /
[2] => /news/
[3] => /about/
[4] => /contact/
)
给定这种数组,你需要做的就是替换键:
$array = array_combine(range(100, 100 + (count($array) - 1)), $array);
它生成键[100, .., 103]
并将它们拼接成数组。
如果数组值是唯一的,可以使用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);
$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;
试试这个,
$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);
根据您的问题更新;不太确定你要做什么,但我有两个猜测。
arr2d_replace_id
将采用所有 uris
并增加键以及一组具有更新键及其值的新数组。
arr2d_replace_id2
将 1) 翻转模板数组 - 我猜测其中的值代表 uris
中的路由 ID,因此翻转以保留值; 2) 增加 uris
上的键值; 3) 根据uris
的key改变翻转数组的值; 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