【问题标题】:Foreach loop inside foreach loop?foreach循环内的foreach循环?
【发布时间】:2014-11-22 12:27:17
【问题描述】:

我有一个名字列表,每个名字由 2-4 个单词组成:名字、(如果存在)中间名、姓氏。

这些是名字:

  • 阿里耶尔马兹
  • Taha Ugur Unal
  • 奥马尔·易卜拉欣·塔辛孙
  • Recai Sahin

等等

我想把这些名字打印成这样:姓,中间名(如果存在)

上面的名字将是:

  • 阿里耶尔马兹 -> 耶尔马兹,阿里
  • Taha Ugur Unal -> Unal, Taha Ugur
  • Omer Ibrahim Tahsin Son -> 儿子,Omer Ibrahim Tahsin
  • Recai Sahin -> Sahin, Recai

等等

如果我只有一个名字,我可以使用该代码:

    <?php $exp1 = explode(" ", $author1); ?>        
    <?php if (count($exp1) == 2) {?>
    <?php print ($exp1[1] .', ' .$exp1[0]); ?>

    <?php } elseif (count($exp1) == 3) {?>
    <?php print ($exp1[2] .', ' .$exp1[0] .' ' .$exp1[1]); ?>

    <?php } elseif (count($exp1) == 4) {?>
    <?php print ($exp1[3] .', ' .$exp1[0] .' ' .$exp1[1] .' ' .$exp1[2]); ?>        

    <?php }?>


每个页面可以有不同数量的作者,我想我可以使用 foreach 为每个作者姓名应用上述代码,但我不能这样做。

我尝试了一段代码:

        <?php foreach $author as $obj): ?>
            <?php $a = explode (" ", $obj) ?> 
        <?php endforeach ?>
        ...


但它给出了错误:

explode() 期望参数 2 是字符串,给定数组。

我该怎么做?

【问题讨论】:

  • 为什么要关闭你的php每一行?
  • 请立即在外部$obj 中执行var_dumpforeach) 并发布结果以便我们进行调查。
  • @vp_arth 因为它是关于 Drupal 结构 (drupal.org/coding-standards)。
  • @Dai,结果如下:Array array(2) { ["tid"]=> string(4) "5930" ["taxonomy_term"]=> object(stdClass)#117 (8 ) { ["tid"]=> string(4) "5930" ["vid"]=> string(1) "2" ["name"]=> string(22) "Çiğdem Apaydın Kaya" ["description" ]=> NULL ["format"]=> NULL ["weight"]=> string(1) "0" ["vocabulary_machine_name"]=> string(5) "yazar" ["rdf_mapping"]=> array(5 ) { ["rdftype"]=> array(1) { [0]=> string(12) "skos:Concept" } ["name"]=> array(1) { ["predicates"]=> array( 2) { [0]=> string(10) "rdfs:label" [1]=> string(14) "skos:prefLabel" } } ["description"]=> array(1) { ["predicates"] => 数组(1){ ...
  • 这个Coding Standards 从来没有说过要这样做)

标签: php foreach explode


【解决方案1】:
<?php
$names = array(
  'Ali Yilmaz',
  'Taha Ugur Unal',
  'Omer Ibrahim Tahsin Son',
  'Recai Sahin'

);

// First you should iterate through:
foreach ($names as $name) {
  // and now, let make the job
  // split by words
  $parts = explode(' ', $name);
  if (count($parts) == 1) {
    echo "{$name}<br/>";
    continue;
  }
  // get last word
  $last = array_pop($parts);
  // Print last one, comma, and rest of name
  echo "{$last}, " . implode(' ', $parts) . "<br/>";
}

【讨论】:

  • @RajibGhosh,不,完全不存在无错误代码 :)
  • 干得好@vp_arth...我正在尝试更新您的代码...如果您有任何问题,我可以删除我更新的代码...如果您愿意。我是开放的..现在我认为你的代码没问题。
  • 我没问题)这不是比赛
【解决方案2】:

如果你有一个字符串,你会

  • explode()分割所有单词。
  • 取出姓氏并保存。
  • 将名称的其余部分与implode() 连接起来。

请看下面的例子:

<?php

$name = "Son of the Mask";
$words = explode(" ", $name);  // split the string wherever there is a whitespace.
$surname = array_pop($words);
$restOfTheName = implode(" ", $words);  // join the words with a whitespace in between them.

echo $surname . ", " . $restOfTheName;

?>

另一方面,如果您有一个名为$namelist 的数组中的名称列表,则可以使用foreach() 循环遍历该列表。

你会做这样的事情:

<?php

foreach ($namelist as $name)
{
    $words = explode(" ", $name);
    $surname = array_pop($words);
    $restOfTheName = implode(" ", $words);

    echo $surname . ", " . $restOfTheName;
}

?>

希望对:-)有帮助


编辑:

不,您不必在每一行都使用&lt;?php?&gt;。这只是有用的,比如当你想在你的 HTML 标签中使用 PHP 的小 sn-ps 时。

例如,假设您想在无序列表中显示一些信息。然后你会做类似的事情

<?php

$info1 = "Head over to Google.com";
$info2 = "Search before you post!";

?>

<ul>
    <li><?php echo $info1; ?></li>
    <li><?php echo $info2; ?></li>
</ul>

但是,对只包含 PHP 代码的脚本执行此操作是没有意义的。此外,它会使您的代码难以阅读,并占用您大量宝贵的时间。

【讨论】:

  • 谢谢,它正在工作。对于您的编辑,您是对的;我正在使用一些跨度标签,所以我在每一行都使用 。正如你所说,我不需要为每一行使用,也许是其中一些。再次感谢。
【解决方案3】:

你可以试试这个

   <?php
     $newNameArray=array();
     $namesArray = array(
       'Ali Yilmaz',
       'Taha Ugur Unal',
       'Omer Ibrahim Tahsin Son',
       'Recai Sahin'
     );
    foreach ($namesArray as $name) {

         $partsOfName = explode(" ", $name);
        //last name
        $lastName = array_pop($partsOfName);
        // store the name in new array
       $newNameArray[]=$lastName.", ".implode(" ", $partsOfName);
     }

    //show all names 
    var_dump($newNameArray);
?>

详情请见explodearray push

【讨论】:

    【解决方案4】:

    使用这个

    foreach ($author as $obj) {
        $nameArr = explode(' ',$obj);
        if(count($nameArr) > 1) {
            $lname = $nameArr[count($nameArr)-1];
            array_pop($nameArr);
            echo $lname.", ".implode(' ',$nameArr);
            echo "<br />";
        } else {
            echo $obj;
            echo "<br />";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-09-26
      • 2012-07-19
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      • 2017-05-28
      • 1970-01-01
      相关资源
      最近更新 更多