Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-如何使用给定数组格式化此输出?_Php_Arrays - Fatal编程技术网

PHP-如何使用给定数组格式化此输出?

PHP-如何使用给定数组格式化此输出?,php,arrays,Php,Arrays,现在我有一个名为$socialMeta的数组,包含: Array ( [0] => Array ( [socialFacebook] => Array ( [0] => http://www.facebook.com/someUsername ) ) [1] => Array ( [socialYoutube] => Array ( [0] =&g

现在我有一个名为$socialMeta的数组,包含:

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 }?>