用PHP替换数组中的ID

时间:2015-07-01 11:39:48

标签: php arrays preg-replace

我有一个这样的数组:

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,将其重新序列化,然后将其复制回数据库。

6 个答案:

答案 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