【问题标题】:php show data from an array in an order instead of randomphp按顺序而不是随机显示数组中的数据
【发布时间】:2019-12-23 18:21:39
【问题描述】:

我正在使用 rand() 随机显示来自数组的数据。是否可以按系统顺序而不是随机显示数据?

$one = data1;
$two = data2;
$three = data3;
$myarray = array($one, $two, $three)
$show = $myarray[rand(0,2)];

注意 $show 变量是在页面中动态调用的,它会在页面的许多地方输出 $myarray 的值

例如。它以随机顺序输出上述数组为data2,data1,data3,data3,data2,data1......

我如何对上述内容进行编码,以便页面上的结果按系统顺序排列,即 首先显示的是数组的第一个值,即 data1 然后是data2,然后是data3,然后是data1,然后是data2,然后是data3,依此类推......

【问题讨论】:

  • 你的意思是在同一个页面/同一个请求中显示这些值,还是在不同请求之间显示这些值?
  • Jeto,我想在同一页面上显示它,该数组实际上是 3 个 url 组,它们通过自定义 wordpress 函数作为前缀动态附加到外部链接,该函数识别外部 url 然后使用上面的代码rand() 函数将前缀附加到外部 urls 。因此,在一个页面上我们可以有 50 个外部 url,而在某些页面上只有 10 个外部 url。这些外部链接的 3 个 url 前缀数组..但是 rand() 不是我们想要的顺序,例如第一个 url 将有 $one ,下一个有 $two ,第三个有 $3 ,第四个有 $one 和因此按顺序...

标签: php arrays random


【解决方案1】:

您可以为此目的使用InfiniteIterator。它正常迭代,然后循环回到开头,依此类推。

它还使用static variables 在后续调用中保留状态。

这就变成了:

add_action('mycustomlink', function ($link) {
  if ($link->is_external()) {
    $externalUrl = $link->get_attr('href');

    static $urls = [
      'https://example1.com?=',
      'https://example2.com?=',
      'https://example3.com?='
    ];

    /** @var Iterator $urlsIterator */
    static $urlsIterator;

    if (!isset($urlsIterator)) {
      $urlsIterator = new \InfiniteIterator(new \ArrayIterator($urls));
      $urlsIterator->rewind();
      $url = $urlsIterator->current();
    } else {
      $urlsIterator->next();
      $url = $urlsIterator->current();
    }

    $link->set_attr('href', $url . $externalUrl);
  }
}, 10, 1);

请注意,我冒昧地将您的代码重构为更适合 PHP7 的语法。

Demo(函数):https://3v4l.org/sq2Gk

【讨论】:

  • Jeto ,用于识别任何页面中的外部 url 的参数可以说是 $exturl 并且最终动态 url 在代码 $finalurl = $show.$exturl; 的末尾只调用一次 [$show 来自我上面的代码] .这个$finalurl 在代码中编写一次,它用$finalurl 替换页面中的所有$exturl 如何能够像rand() 一样使用Iterator 一次来获得有序的输出?因为我不能在我的代码中多次调用你的代码的$url
  • @Martin 抱歉,我没有真正关注。请使用类似于您现在拥有的更精确的样本来编辑您的问题。现在有点太模糊了。
  • Jeto,我已经用详细的例子编辑了这个问题,请现在检查。
  • Jeto 它似乎在 wordpress 安装中不起作用,但在 php 示例中你给它的工作。我们无法触及执行前缀操作的插件所需的以下部分代码[请参阅编辑 2 了解我们不应编辑的部分代码和我们可以编辑的部分]
  • @Martin 对不起,我实际上是想把它改回原来的样子,但忘了。再次编辑我的答案。
【解决方案2】:

使用会话变量保存数组索引,每次递增。

session_start();
$one = data1;
$two = data2;
$three = data3;
$myarray = array($one, $two, $three)
if (isset($_SESSION['myarray_index'])) {
    // increment with wraparound
    $myarray_index = ($_SESSION['myarray_index'] + 1) % count($myarray);
} else {
    $myarray_index = 0;
}
$_SESSION['myarray_index'] = $myarray_index;
$show = $myarray[$myarray_index];

【讨论】:

    猜你喜欢
    • 2018-11-29
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    相关资源
    最近更新 更多