用 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