簡體   English   中英

根據參考在關聯 php 數組中添加鍵

[英]Add keys in associative php array as per reference

我有一個數組,所以我想為每個值添加鍵,例如,如果數組包含 Facebook URL 那么鍵應該是 Facebook 如果數組有 Instagram 的鏈接那么鍵應該是 Instagram 並且列表繼續。

這是代碼

<?php
foreach($social_media as $social){

$typesocial = $social['type'];
if($social['type'] === 'social network') {
$val[] = $social['url']['resource'];
}

}
print_r($val);

?>
Array ( 
[0] => https://plus.google.com/+beyonce
[1] => https://twitter.com/Beyonce
[2] => https://www.facebook.com/beyonce
[3] => https://www.instagram.com/beyonce/
[4] => http://www.weibo.com/beyonceofficial 
)

它應該變成,如果值有一個鏈接 twitter 那么密鑰應該是 twitter 如果是 Instagram 那么它應該是 Instagram

Array ( 
[google] => https://plus.google.com/+beyonce
[twitter] => https://twitter.com/Beyonce
[facebook] => https://www.facebook.com/beyonce
[instagram] => https://www.instagram.com/beyonce/
[weibo] => http://www.weibo.com/beyonceofficial 
)
$indexed = [
'https://plus.google.com/+beyonce',
'https://twitter.com/Beyonce',
'https://www.facebook.com/beyonce',
'https://www.instagram.com/beyonce/',
'http://www.weibo.com/beyonceofficial',
];

假設主機由 2 或 3 個部分組成

$assoc = [];
foreach($indexed as $url) {
    $host = explode('.', parse_url($url, PHP_URL_HOST));
    switch (count($host)) {
        case 2:
            $assoc[$host[0]] = $url;
            break;
        case 3:
            $assoc[$host[1]] = $url;
   }
}

將 output $assoc as

array(5) {
  'google'    =>  string(32) "https://plus.google.com/+beyonce"
  'twitter'   =>  string(27) "https://twitter.com/Beyonce"
  'facebook'  =>  string(32) "https://www.facebook.com/beyonce"
  'instagram' =>  string(34) "https://www.instagram.com/beyonce/"
  'weibo'     =>  string(36) "http://www.weibo.com/beyonceofficial"
}

這也許? 希望有所幫助

已編輯

$array = Array ( 
0 => 'https://plus.google.com/+beyonce',
1 => 'https://twitter.com/Beyonce',
2 => 'https://www.facebook.com/beyonce',
3 => 'https://www.instagram.com/beyonce/',
4 => 'http://www.weibo.com/beyonceofficial',
  6 => 'http://www.bbc.co.uk/a/witty/documentary'
);
$output = Array();
foreach($array as $key => $url){
 $urlarr = parse_url($url);
 $arr = explode('.',$urlarr['host']);
 $name =  $arr[count($arr) - 2];
  if($name == 'co'){
    $name =  $arr[count($arr) - 3]; 
  }
 $output[$name] = $url;
}
print_r($output);

您可能想使用strpos()以便找到單詞並添加特定的鍵,如下所示:

$new_array = [];
foreach($old_array AS $value){
    if(strpos($value, 'facebook')) {
        $new_array['facebook'] = $value;
    }elseif(strpos($value, 'instagram')) {
        $new_array['instagram'] = $value;
    }elseif(strpos($value, 'twitter')) {
        $new_array['twitter'] = $value;
    }else{ //so it goes...
        $new_array['unknow'] = $value;
    }
}

當然,如果你有兩個 url 和 facebook,第二個會覆蓋第一個,所以取決於你需要什么,你可以添加一個額外的索引……比如:

$new_array['facebook'][] = $value;

希望能幫助到你!

解決這個問題的一種快速/簡單的方法可能是在域上進行正則表達式匹配。

例如,如果您有一組有限的社交媒體並且可以信任域名的中間部分,那么您可以提取 url 的那部分並將其作為您的密鑰的一部分。

例如,正則表達式/google|twitter/將匹配來自https://plus.google.com/+beyoncegoogle 然后可以將其用於您的密鑰。

因此,循環遍歷您的集合,您將運行preg_match ,它會嘗試根據域名查找密鑰。 preg_match有一個名為$match的參數,它存儲你匹配的google部分。 您可以使用它作為格式化數組的鍵。

$array = [
    'https://plus.google.com/+beyonce',
    'https://twitter.com/Beyonce',
    'https://www.facebook.com/beyonce',
    'https://www.instagram.com/beyonce/',
    'http://badmedia.com/beyonce',
    'http://www.weibo.com/beyonceofficial'
];

$keyed = [];

foreach ($array as $i => $url) {
    preg_match('/google|twitter|facebook|instagram|weibo/', $url, $match);
    $key = isset($match[0]) ? $match[0] : 'notfound-' . $i;
    $keyed[$key] = $url;
}

這里的結果是$keyed現在包含$keyed['google']和其他數組。

添加或從google|twitter|facebook|instagram|weibo中刪除以擁有|another您希望或多或少支持不同網站的地方。

它的可擴展性不是很好,如果域與您要使用的鍵不匹配,那么在這種情況下,我將其設置為使用原始數組鍵創建一個名為notfound-的鍵。 (我已將badmedia.com添加到列表中以進行演示。)。 您還冒着發生沖突的風險,有人可能很聰明,並將其 Facebook 用戶名設置為“nottwitter”,這在技術上與“twitter”匹配

因此,您可能要考慮的是為每個完整域名保留正則表達式匹配,而不是依賴域為您提供密鑰。 您可以針對要使用的密鑰存儲這些正則表達式查詢,然后嵌套兩個循環以找到匹配項……

例如:

$socialMedia = [
    'facebook' => '/^(https?:\/\/)?(www\.)?facebook.com\/[a-zA-Z0-9(\.\?)?]/',
]

foreach ($array as $url) {
    foreach ($socialMedia as $key => $regex) {
        if (preg_match($regex, $url)) {
            $keyed[$key] = $url;
        }
    }
}

大喊 https://gist.github.com/atomicpages/4619196以獲得完整的 FB 域正則表達式)

對於非常小的集合(我想你在任何時候都在處理)這會稍微好一點並給你一個更好的結果......它也會拒絕並刪除你不支持的任何東西,但你需要抓住那些分開。

對於較大的集合,您可能首先想看看如何收集 url...而不是接受任何列表,也許有表格或 API 調用您從 state 收到這些,它正在進入的路上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM