php将数组元素合并到同一个数组中的新键中

时间:2012-09-06 01:03:14

标签: php arrays

我需要将数组中的一些键值合并到一个新键=>值,但在同一个数组,我无法弄清楚如何。

所以我有这个数组:

array(
[title] => something
[status] => something
[url_1] => http://someurl.com
[url_2] => http://someurl.com
[url_3] => http://someurl.com
[url_4] => http://someurl.com
)

我需要一个像这样的数组:

array(
[title] => something
[status] => something
[all_url] => http://someurl.com,http://someurl.com,http://someurl.com,http://someurl.com
)

哦,如果url_2,url_3,url_4为空,请不要将分隔符放在url_1之后,当然如果url_1为空则不要将分隔符放在url_2之前

5 个答案:

答案 0 :(得分:1)

您可以使用implode功能。如果您将url部分作为另一个数组,则可以轻松地创建如下字符串:

$all_url = implode(',', $url_parts);

内爆功能仅在需要时添加分隔符。如果url部分总是成为主数组的一部分,你可以这样做:

$temp_arr = array();
$i = 1;
while($temp_url = $array[url_{$i}]){
    $temp_arr[] = $temp_url;
    unset($array[url_{$i}]);
    $i++;
}
$array[all_url] = implode(',', $temp_arr);

答案 1 :(得分:1)

试试这个

<?php
$param = array(
'title' => 'something',
'status' => 'something',
'url_1'=> 'http://someurl.com',
'url_2' => 'http://someurl.com',
'url_3' => 'http://someurl.com',
'url_4' => 'http://someurl.com',
);

$meta = array('title','status');

$metas = array_intersect_key(array_flip($meta),$param);
$metas['all_url'] = implode(',', array_diff_key($param, array_flip($meta)));

var_export($metas);

demo http://codepad.org/SwP87PyL

答案 2 :(得分:0)

$yourArray['all_url'] = implode(',', array(
    $yourArray['url_1'],
    $yourArray['url_2'],
    $yourArray['url_3'],
    $yourArray['url_4'],
));
unset($yourArray['url_1'], $yourArray['url_2'], $yourArray['url_3'], $yourArray['url_4'])

var_dump($yourArray):

或者如果你想让它更具可扩展性:

function mergeUrls($inputArray, $filter = 'url_')
{
    $urls = array();
    foreach($inputArray as $key => $value) {
        if (strpos($value, $filter) !== 0) {
            continue;
        }

        $urls[] = $value;
        unset($inputArray[$key]);
    }

    $inputArray['all_urls'] = implode(',', $urls);
    return $inputArray;
}

答案 3 :(得分:0)

也试试这个:

$data = array(
            'title' => 'something',
            'status' => 'something',
            'url_1' => 'http://someurl.com',
            'url_2' => 'http://someurl.com',
            'url_3' => 'http://someurl.com',
            'url_4' => 'http://someurl.com',
        );
        $array1 = array();
        $string = "";
        foreach ($data as $key => $value)
            if (substr($key, 0, 4) == "url_")
                $string = $string . $value . ",";
            else
                $array1[$key] = $value;

        $array1['all_url'] = substr($string, 0, strlen($string) - 1);
        print_r($array1);

答案 4 :(得分:0)

如果您确定在阵列的开头(标题,状态)上总是有这两个字段,那么您可以拥有类似的东西..

<?php
// Consider you have an array similar to this
$yourArray = array(
    'title'  => 'something',
    'status' => 'something',
    'url_1'  => 'http://someurl.com',
    'url_2'  => 'http://someurl.com',
    'url_3'  => 'http://someurl.com'
);

$newArray['title']  = array_shift($yourArray);
$newArray['status'] = array_shift($yourArray);

// Now $yourArray should only contain the url_X fields so...

$newArray['all_url'] = implode(',', $yourArray);

因此,array_shift将检索并删除数组的第一个元素,通过使用它两次,您将从数组中删除标题和状态,留下url_X字段,然后您可以使用{ {3}}合并剩余的数组项,使用第一个参数作为 glue (参见php文档)。