0

配列内のいくつかのキー値を新しいkey=>値にマージする必要がありますが、同じ配列内にあり、その方法を理解できませんでした。

だから私はこの配列を持っています:

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の前にセパレータを配置しないでください。

4

5 に答える 5

1

この機能を使用できますimplode。別の配列としてURLパーツがある場合は、次のような文字列を簡単に作成できます。

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

implode関数は、必要な場合にのみセパレーターを追加します。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);
于 2012-09-06T01:06:54.523 に答える
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);

デモhttp://codepad.org/SwP87PyL

于 2012-09-06T01:12:17.123 に答える
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;
}
于 2012-09-06T01:07:17.320 に答える
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);
于 2012-09-06T01:14:53.583 に答える
0

配列の先頭にこれらの2つのフィールド(タイトル、ステータス)が常にあると確信している場合は、次のようにすることができます。

<?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は、配列の最初の要素を取得して削除します。これを2回使用すると、配列からタイトルとステータスが削除され、url_Xフィールドが残ります。次に、implodeを使用して残りの配列アイテムをマージできます。最初のパラメーターを接着剤として使用します(phpのドキュメントを参照)。

于 2012-09-06T01:23:36.440 に答える