PHP-如何使用给定数组格式化此输出?
现在我有一个名为$socialMeta的数组,包含:PHP-如何使用给定数组格式化此输出?,php,arrays,Php,Arrays,现在我有一个名为$socialMeta的数组,包含: Array ( [0] => Array ( [socialFacebook] => Array ( [0] => http://www.facebook.com/someUsername ) ) [1] => Array ( [socialYoutube] => Array ( [0] =&g
Array (
[0] => Array (
[socialFacebook] => Array (
[0] => http://www.facebook.com/someUsername
)
)
[1] => Array (
[socialYoutube] => Array (
[0] => http://www.youtube.com/user/someUsername
)
)
[2] => Array (
[socialSoundcloud] => Array (
[0] => http://www.soundcloud.com/someUsername
)
)
)
从这个数组中,我需要创建以下输出:
<div class="social">
<a href="http://www.facebook.com/someUsername" class="fb" target="_blank">Add us on <span>Facebook</span></a>
<a href="http://www.youtube.com/user/someUsername" class="yt" target="_blank">Visit us on <span>Youtube</span></a>
<a href="http://www.soundcloud.com/someUsername" class="sc" target="_blank">Visit us on <span>Souncloud</span></a>
</div>
请不要担心第一个链接有不同的锚文本
对于锚类,我可以使用$socialMeta键来简化整个过程。
首先确定数组中每个元素的网络(在以下示例中,我假设名称为$array
):
<?php
function flattenArray(array $input){
$nu = array();
foreach($input as $k => $v){
if(is_array($v) && count($v) == 1){
$nu[key($v)] = current($v);
if(is_array($nu[key($v)]) && count($v) == 1)
$nu[key($v)] = current($nu[key($v)]);
}
else
$nu[$k] = $v;
}
return $nu;
}
// here you can maintain the sortorder of the output and add more social networks with the corresponding URL-text...
$urlData = array(
'socialFacebook' => 'Add us on <span>Facebook></span>',
'socialYoutube' => 'Visit us on <span>Youtube</span>',
'socialSoundcloud' => 'Visit us on <span>Souncloud</span>',
);
$testArray = array(
array('socialFacebook' => array('http.asdfsadf')),
array('socialYoutube' => array('http.asdfsadf')),
array('socialSoundcloud' => array('http.asdfsadf'))
);
$output = flattenArray($testArray);
然后变换数组(您应该为该函数找到更好的名称):
现在只需在$array
的元素上循环:
foreach($array as $row) {
$network = $row['network'];
$url = $row['url'];
$class = $row['class'];
if ($network === 'Facebook')
$link_text = 'Add us on <span>%s</span>';
else
$link_text = 'Visit us on <span>%s</span>'
$link_text = sprintf($link_text, $network);
printf('<a href="%s" class="%s" target="_blank">%s</a>',
$url, $class, $link_text);
}
foreach($array作为$row){
$network=$row['network'];
$url=$row['url'];
$class=$row['class'];
如果($network=='Facebook')
$link_text='在%s上添加我们';
其他的
$link_text='在%s访问我们'
$link\u text=sprintf($link\u text$network);
printf(“”,
$url、$class、$link\u text);
}
添加一个名为“网络”或类似于网络名称的键(Youtube、Facebook等)会更有效。在密钥中携带这样的信息只会使这个问题变得相当棘手,因为您将不得不强行前进。你能在数组中添加这样一个字段吗?不,我不能。这个数组是从Wordpress自定义字段创建的。对不起,伙计们!我编辑了这个问题——对我来说是糟糕的一天;)但我的答案也有所改进——应该符合他的需要。是的,当然。。。你可以用另一种方式。。。给我一点时间,我来编辑这篇文章
function add_network($array) {
static $networks = array('Facebook', 'Youtube', 'Soundcloud');
foreach($networks as $network)
if (isset($array['social' . $network])) {
$array['network'] = $network;
return $array;
}
//None found
$array['network'] = false;
return $array;
}
$array = array_map('add_network', $array);
function transform_array($a) {
static $classes = array('Youtube' => 'yt', 'Facebook' => 'fb', 'Soundcloud' => 'sc');
$network = $a['network'];
$class = $classes[$network];
$url = $a['social' . $network][0]
return array('network' => $network,
'url' => $url,
'class' => $class);
}
$array = array_map('transform_array', $array);
foreach($array as $row) {
$network = $row['network'];
$url = $row['url'];
$class = $row['class'];
if ($network === 'Facebook')
$link_text = 'Add us on <span>%s</span>';
else
$link_text = 'Visit us on <span>%s</span>'
$link_text = sprintf($link_text, $network);
printf('<a href="%s" class="%s" target="_blank">%s</a>',
$url, $class, $link_text);
}
<?php if (!empty($socialMeta)) { ?>
<div class="social">
<?php foreach ($socialMeta as $rows) {?>
<?php foreach ($rows as $key => $val) {?>
<?php
switch ($key) {
case "socialFacebook":
$title = "Facebook";
$class = "fb";
break;
case "socialYoutube":
$title = "Youtube";
$class = "yt";
break;
case "socialSoundcloud":
$title = "Souncloud";
$class = "sc";
break;
}
?>
<a href="<?php echo $val[0]; ?>" class="<?php echo $class; ?>" target="_blank">Add us on <span><?php echo $title; ?></span></a>
<?php }?>
<?php }?>
</div>
<?php }?>