PHP 中的 Vigenère 表

Posted

技术标签:

【中文标题】PHP 中的 Vigenère 表【英文标题】:Vigenère table in PHP 【发布时间】:2018-01-14 14:59:14 【问题描述】:

我正在尝试使用 php 制作 Vigenère 表。我的目标是制作一个包含 26 个较小数组的大数组,如下所示:

$bigarray = [['a'-'z']['b'-'a']...['y'-'x']['z'-'y']];

我正在考虑使用 range() 函数创建第一个数组,将其附加到大数组中,然后使用 for 循环获取第一个字母,将该字母放在末尾并使该数组附加到一个大数组 x25

$letterarray = range('a','z');
array_merge($bigarray, $firstarray);

for ($idx = 0; $idx < 26; $idx++) 
    $letterarray = /* Take first letter from $letterarray, put that letter in the end. */
    $bigarray = /* Put the $letterarray into the $bigarray. */

我不知道是否需要使用 array_splice()array_slice() 函数。我也不知道如何在保持“数组中的数组”形式的同时将小数组放入大数组,因为 array_merge() 只是将每个值推入一个数组。

【问题讨论】:

【参考方案1】:

你的方法是可靠的。要执行,只需复制之前的数组,然后使用array_shiftarray_push“循环”即可。

$bigarray = [range('a','z')];
for( $i=1; $i<26; $i++) 
    // $i=1 because we already have the first one.
    $copy = $bigarray[$i-1]; // get most recent entry
    array_push($copy,array_shift($copy));
    $bigarray[$i] = $copy;

【讨论】:

【参考方案2】:

感谢您的评论,在我写完这个帖子后,我自己想出了一个办法。

$bigarray = array();
$alphas = range('a', 'z');
$bigarray[0] = $alphas;

for ($idx = 1; $idx <= 25; $idx++) 
    $firstletter = $alphas[0];
    $alphas = array_slice($alphas,1);
    array_push($alphas, $firstletter);
    $bigarray[$idx] = $alphas;

它将 [a-z] 数组 ($alphas) 的第一个字母存储在变量 $firstletter 中,对 $alphas 数组进行切片并将元素推入最后的 $firstletter 变量中,并将新数组 [b-a] 存储到$bigarray。

巧妙的是array_slice 只是自动更改索引。 感谢您的评论:)

-埃德

【讨论】:

以上是关于PHP 中的 Vigenère 表的主要内容,如果未能解决你的问题,请参考以下文章

Vigenère 密码,C 中的问题

编码 Vigenère 密码时 c 中的分段错误

如何让我的 Vigenère 密码处理消息中的空格?

C中的Vigenère密码,如何仅在字母字符上移动关键字

如何让我的 Vigenère Cipher 忽略原始消息中的空格

Python Vigenère密码不起作用