根据参考在关联 php 数组中添加键

Add keys in associative php array as per reference

我有一个数组,所以我想为每个值添加键,例如,如果数组包含 Facebook URL,那么键应该是 Facebook,如果数组有 link 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 link 那么键应该是 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 
)

您可能想使用 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;

希望对您有所帮助!

这可能吗?希望有所帮助

已编辑

$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);
$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"
}

解决此问题的 quick/easy-ish 方法可能是在域上进行正则表达式匹配。

例如,如果您拥有一组有限的社交媒体并且可以信任域名的中间部分,那么您可以提取 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 呼叫您正在从正在进入的州收到这些信息。