合并子数组并从结果数组中获取随机值


Merge subarray and get random values from result array

我正在尝试为值数组或单个字符串创建字符串排列,这就是我的做法:

function aliasName($string)
{
    $names = [];
    if (is_array($string)) {
        foreach ($string as $str) {
            $names[] = internalProcessing($str);
        }
    } else {
        $names[] = internalProcessing($string);
    }
    return $names[array_rand($names)];
}
function internalProcessing($str)
{
    $names = [];
    $input = strtolower($str);
    $length = strlen($input);
    $counter = pow(2, $length);
    for ($i = 0; $i < $counter; ++$i) {
        $binaryStr = str_pad(decbin($i), $length, '0', STR_PAD_LEFT);
        $variant = '';
        for ($j = 0; $j < $length; ++$j) {
            $variant .= ($binaryStr[$j] == '1') ? strtoupper($input[$j]) : $input[$j];
        }
        $names[] = $variant;
    }
    return $names;
}
$test1 = ['Mami', 'Abonis', 'Acierto', 'Alison', 'Bato', 'Chiste', 'Amada', 'Calor', 'Dato', 'Fiera', 'Exito'];
$test2 = 'mamI';
$test1Result = aliasName($test1);
$test2Result = aliasName($test2);
echo "'n test1 -------------------------------- 'n";
var_export($test1Result);
echo "'n test2 -------------------------------- 'n";
var_export($test2Result);

代码运行良好,但我有一些问题,我需要一些帮助。如果在控制台脚本中运行上述代码,则应看到如下所示的输出:

# php test.php
 test1 --------------------------------
array (
  0 => 'abonis',
  1 => 'aboniS',
  2 => 'abonIs',
  3 => 'abonIS',
  4 => 'aboNis',
  5 => 'aboNiS',
  6 => 'aboNIs',
  7 => 'aboNIS',
  8 => 'abOnis',
  9 => 'abOniS',
  10 => 'abOnIs',
  ...
)
 test2 --------------------------------
array (
  0 => 'mami',
  1 => 'mamI',
  2 => 'maMi',
  3 => 'maMI',
  4 => 'mAmi',
  5 => 'mAmI',
  6 => 'mAMi',
  7 => 'mAMI',
  8 => 'Mami',
  9 => 'MamI',
  10 => 'MaMi',
  ...
)

test2输出很好,但test1不是。如果您在internalProcessing()(就在返回之前)转储$names的内容,您将获得类似以下内容:

// var_export($names);  
// return $names;
# php test.php
array (
  0 => 'mami',
  1 => 'mamI',
  ...
)array (
  0 => 'abonis',
  1 => 'aboniS',
  ...
)array (
  0 => 'acierto',
  1 => 'aciertO',
  ...
)array (
  0 => 'alison',
  1 => 'alisoN',
  ...
)array (
  0 => 'bato',
  1 => 'batO',
  ...
)array (
  0 => 'chiste',
  1 => 'chistE',
  ...
)array (
  0 => 'amada',
  1 => 'amadA',
  ...
)array (
  0 => 'calor',
  1 => 'caloR',
  ...
)array (
  0 => 'dato',
  1 => 'datO',
  ...
)array (
  0 => 'fiera',
  1 => 'fierA',
  ...
)array (
  0 => 'exito',
  1 => 'exitO',
  ...
)array (
  0 => 'mami',
  1 => 'mamI',
  ...
)

我需要将该输出转换为以下内容:

$result_array = array (
    0 => 'mami',
    1 => 'mamI',
    ...,
    0 => 'abonis',
    1 => 'aboniS',
    ...,
    0 => 'acierto',
    1 => 'aciertO',
    ...,
    0 => 'alison',
    1 => 'alisoN',
    ...,
    0 => 'bato',
    1 => 'batO',
    ...,
    0 => 'chiste',
    1 => 'chistE',
    ...,
    0 => 'amada',
    1 => 'amadA',
    ...,
    0 => 'calor',
    1 => 'caloR',
    ...,
    0 => 'dato',
    1 => 'datO',
    ...,
    0 => 'fiera',
    1 => 'fierA',
    ...,
    0 => 'exito',
    1 => 'exitO',
    ...,
    0 => 'mami',
    1 => 'mamI',
    ...
  )

最后,如果输入是一个值数组,那么我应该返回 0 到 count($result_array) 之间的任何随机值。我已经尝试过array_merge()但对我不起作用,因为我得到了错误的结果。谁能在这里给我一些推动力?

你确实有数组的数组,因为 internalProcessing 返回一个数组,你把这个结果作为一个数组元素放在一个包装数组中,如下所示:

 $names[] = internalProcessing(...);

相反,您应该按如下方式存储内部处理的结果(在两次出现中):

 $names = array_merge($names, internalProcessing(...));

正如你在这个小提琴中看到的那样,这就是诀窍。