'loop through an anchor id

I apologize is any of this does not look right, it is my first time asking a question on this site.

I am creating a webpage using html, css, and php. Specifically, I am trying to create subnavigation links on my page using information from a database.

Here is the code I have:

foreach ($subArr as $sub => $result)
{
    if (mysql_num_rows($result) > 0)
    {
       $resultString .= '<a id="$sub" style="cursor: poimter; color: #0076cf;" href="$sub">'.'  |  '.$sub.'  |  '.'</a>';
    }
 }

$subArr is an array of subcategories that I would like the user to be able to click on the link with the subcategory's name and it will take them to that part of the same page. As of right now, all it does is create one giant link under all of the subcategory names instead of creating each individual link.

Obviously I need some sort of loop, but I am not sure how to look through the $resultString to change both the anchor id and href.

Any help is much appreciated!!



Solution 1:[1]

(Of topic, but important)

You have a typo, it should be :

style="cursor: pointer; ..."

Instead of :

style="cursor: poimter; ..."

Solution 2:[2]

There is an error in your code.

You put variable in '' which php won't parse to get proper result you need to put variable in "".

foreach ($subArr as $sub => $result)
{
    if (mysql_num_rows($result) > 0)
    {
       $resultString .= '<a id="'.$sub.'" style="cursor: pointer; color: #0076cf;" href="'.$sub.'">  |  '.$sub.'  |  </a>';
    }
 }

Moreover it looks weird to have same ID as href is.

I've noticed you use mysql_* function which are depracated and will be removed in future. Consider using PDO or MySQLi instead.

Solution 3:[3]

foreach ($subArr as $sub => $result)
{
  if (mysql_num_rows($result) > 0)
  {
    $resultString = '<a id="$sub" style="cursor: pointer; color: #0076cf;" href="$sub">'.'  |  '.$sub.'  |  '.'</a>';
  }

  $resultstring="";
}

Solution 4:[4]

you seem to be on the right track but have a few things mixed up.

Menu

Firstly when making a menu you want to use an unordered list, then style it with CSS. A basic example of this is:

<ul class="menu">
    <li><a href="test">Test</a></li>
    <li><a href="test2">Test 2</a></li>
    <li><a href="test3">Test 3</a></li>
</ul>

You then style it with the following CSS

ul.menu, ul.menu * {
    list-style: none;
    padding: 0;
    margin: 0;
}

ul.menu {
    width: 100%;
    height: 20px;
    background: #ccc;
    padding: 5px 0; /* Add padding top and bottom */
}

ul.menu > li {
    height: 20px;
    line-height: 20px;
    float: left;
}

/* Make a tag fill the entire LI so users can click
anywhere, not just on the text. */
ul.menu > li > a { 
    display: block;
    padding: 0 10px; /* Add padding between items */
    color: #000;
    text-decoration: none;
}

ul.menu > li > a:hover, ul.menu > li > a:active {
    background: #000;
    color: #FFF;
}

/* Add divider between items, except last item (Does not work with earlier versions of IE) */
ul.menu > li:not(:last-child) {
    border-right: 1px solid #000;
}

PHP Loop

Firstly a note. You're using mysql, which is depreciated. That means that in a version of PHP some time soon it is not going to be available any more. A lot of people recommend you learn PDO. Personally I prefer MySQLi over prepared statements, but that's just my preference. Either is fine, but learn one of them.

Now for your loop. You seem to be checking for a result from your mysql query within your loop, that's wrong. I'm guessing above that you have a query which loads it's results into $subArr. You need to call mysql_num_rows before you load them into $subArr.

The loop itself is fine other than that once you apply it to a list as above. Your final code should look something like this. Note, I've used MySQLi in my example, I recommend you do the same although it shouldn't be too hard for you to convert it to MySQL if you wish to.

<?php
$subArr = array();
$query = "SELECT something FROM somewhere";
$result = $mysql->query($query);
if($result->num_rows) {
    while($row = $result->fetch_assoc()) { //I personally prefer fetch_assoc over the others, but fetch_row or fetch_array are both fine here too.
        $subArr = $row;
    }
}

//Lets output the menu
$resultString .= '<ul class="menu">';
foreach($subArr as $sub => $result) {
    $resultString .= '<li><a href="' . $result['url'] . '">' . $result['name'] . '</a></li>'
}
$resultString = '</ul>';

As one last point of note, you don't need to put a cursor: pointer on an a tag, it has that styling by default.

I hope this manages to clear some things up for you.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Bun
Solution 2 Robert
Solution 3 p.s.w.g
Solution 4 Styphon