[英]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/+beyonce
的google
。 然后可以將其用於您的密鑰。
因此,循環遍歷您的集合,您將運行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.