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

问题描述 投票:-1回答:4

我有一个数组,所以我想向每个值添加键,例如,如果一个数组包含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 
)
php arrays associative-array
4个回答
0
投票

也许吧?希望对您有所帮助

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

0
投票
$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"
}

0
投票

一种快速/轻松的方法可能是在域上进行正则表达式匹配。

例如,如果您有一组有限的社交媒体,并且可以信任域名的中间部分,那么您可以提取该部分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调用是从哪个状态接收它们的即将到来。


-1
投票

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

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.