我有一个数组,所以我想向每个值添加键,例如,如果一个数组包含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
)
也许吧?希望对您有所帮助
$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'
);
$output = Array();
foreach($array as $key => $url){
$urlarr = parse_url($url);
$arr = explode('.',$urlarr['host']);
$name = $arr[count($arr) - 2];
$output[$name] = $url;
}
print_r($output);
$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;
}
}
将$ assoc输出为
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"
}
一种快速/轻松的方法可能是在域上进行正则表达式匹配。
例如,如果您有一组有限的社交媒体,并且可以信任域名的中间部分,那么您可以提取该部分URL,并将其作为密钥的一部分。
例如,正则表达式/google|twitter/
将与google
中的https://plus.google.com/+beyonce
相匹配。然后可以将其用作您的密钥。
因此遍历您的集合,您将运行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;
}
}
}
(对于完整的FB域正则表达式,向https://gist.github.com/atomicpages/4619196发出喊叫声]
对于非常小的集合(我想您随时都在处理),这会稍微扩展一下并为您提供更好的结果...它还会拒绝并删除您不支持的任何集合,但是您需要分别捕捉它们。
对于较大的集合,您可能首先要看一下如何收集网址...而不是接受任何列表,也许有表单或API调用是从哪个状态接收它们的即将到来。
您可能想使用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;
}
}
当然,如果您的Facebook有两个URL,第二个将覆盖第一个,因此根据您的需要,您可以添加一个附加索引...,例如:
$new_array['facebook'][] = $value;
希望有帮助!