【问题标题】:Get unique value from an array php从数组php中获取唯一值
【发布时间】:2017-07-04 13:47:43
【问题描述】:

我只想显示唯一的字符串,我有这个代码:

$sql = "SELECT tags FROM videos";
$result = mysqli_query($mysqli, $sql);
while ($rez = $result->fetch_assoc()) {
    $array = array_filter(explode(',', $rez['tags']));
    $array = array_unique($array); 
    foreach ($array as $value) {
        $value = ltrim($value);
        $value = str_replace(" ", "-", $value);
        echo '<a href="http://example.com/' . $value . '">' . $value . '</a><br>';
    }
}

我已将array_unique 设为这样:

$array = array_unique($array); 

但它会返回:

word-word
word
word2
word3
word-word

它不只打印唯一值。怎么了?

【问题讨论】:

  • var_dump($rez['tags']);的结果是什么?
  • 您可以使用 SELECT DISTINCT 标签...这将为您提供一个独特的数据集。
  • SELECT DISTINCT 我做不到,因为在标签中,对于每个视频,我都有 tag1、tag2、tag3、tag4、tag5 ... @waterloomatt
  • var_dump($rez['tags']); 它显示了所有标签和每个字符串之前的 nr @loko
  • @user3266370 当您不规范化数据库时会发生这种情况。

标签: php arrays unique


【解决方案1】:

认为问题在于字符串是在 array_unique 操作之后而不是之前处理的。请尝试以下方法:

$sql = "SELECT tags FROM videos";
$result = mysqli_query($mysqli, $sql);
while ($rez = $result->fetch_assoc()) {
    $array = array_filter(explode(',', $rez['tags']));
    foreach ($array as $value) {
        $value = ltrim($value);
        $value = str_replace(" ", "-", $value);
    }
    $array = array_unique($array); 
    foreach ($array as $value) {
        echo '<a href="http://example.com/' . $value . '">' . $value . '</a><br>';
    }
}

【讨论】:

    【解决方案2】:

    我已经解决了,我会发布代码可能对某人有好处!

    $sql = "SELECT tags FROM videos";
    $result = mysqli_query($mysqli, $sql);
    $alltags=array();
    while ($rez = $result->fetch_assoc()) {
        $array = array_filter(explode(',', $rez['tags']));
        foreach ($array as $key => $value) {
            $value = ltrim($value);
            $value = str_replace(" ", "-", $value);
            $alltags[]=$value;
        }
    }
    $array=array_unique($alltags);
    foreach ($array as $value) {
        echo '<a href="http://example.com/' . $value . '">' . $value . '</a><br>';
    }
    

    【讨论】:

      【解决方案3】:
      1. 分解你的字符串。
      2. 修剪每个元素的外部空间。
      3. 用连字符替换每个元素中的内部空格。
      4. 只保留非空元素。
      5. 仅保留唯一元素(使用双数组翻转)。
      6. 显示结果。

      代码:(Demo)

      while($rez=$result->fetch_assoc()) {
          $array=explode(',',$rez['tags']);       // split into elements
          foreach($array as $v){
              $v=str_replace(" ","-",trim($v));   // remove outer spaces, replace inner spaces
              if($v){$clean[]=$v;}                // retain non-empty values
          }
          $clean=array_flip(array_flip($clean));  // double flip is faster than array_unique
          foreach($clean as $v){
              echo "<a href=\"http://example.com/$v\">$v</a><br>";
          }
      }
      


      或者,您可以在第一个 foreach 循环中完成所有值和 html 准备,然后使用 implode 显示批处理。这将从最终元素中删除可能不必要的尾随

      代码:

      $rez['tags']=' ,  word , word-word, word2 , word word, word3,';
      $array=explode(',',$rez['tags']);       // split into elements
      foreach($array as $v){
          $v=str_replace(" ","-",trim($v));   // remove outer spaces, replace inner spaces
          if($v){
              $clean[]="<a href=\"http://example.com/$v\">$v</a>";  // prep non-empty values for display
          }
      }
      echo implode("<br>",array_unique($clean));
      

      输出:

      <a href="http://example.com/word">word</a><br>
      <a href="http://example.com/word-word">word-word</a><br>
      <a href="http://example.com/word2">word2</a><br>
      <a href="http://example.com/word3">word3</a>
      

      【讨论】:

      • 它向我展示了第一个代码,但我没有得到唯一的标签
      • @user3266370 您从未发布过原始字符串供我们使用。既然你说你的代码是成功的,我已经更新了我的一些改进。在我的演示中,您将看到原始字符串以空格开头,然后是逗号。这意味着在爆炸之后,第一个元素将是一个空格。我的方法将删除这个空间,但你的方法不会因为你的 array_filter 在我们的代码中排序。请试试我的新代码,我想你会发现它成功/更好。
      猜你喜欢
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 2011-09-22
      • 2023-03-21
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多