根据参考在关联 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 呼叫您正在从正在进入的州收到这些信息。
我有一个数组,所以我想为每个值添加键,例如,如果数组包含 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 呼叫您正在从正在进入的州收到这些信息。