2016-02-04 4 views
0

Я пытаюсь создать строку перестановку для массива значений или для одной строки и это, как я делаю:Слияние подмассива и получить случайные значения из результирующего массива

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 нет. Если сбросить содержание $names в internalProcessing() (как раз перед возвращением) вы получите что-то вроде:

// 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', 
    ... 
) 

И, наконец, если input - это массив значений, тогда я должен возвращать любые случайные значения между 0 и count ($ result_array). Я пробовал array_merge(), но не работал для меня, так как я получил неправильный результат. Может ли кто-нибудь дать мне толчок здесь?

+0

Что не так с выходом test1, что не так в test2? – trincot

ответ

1

Вы действительно массивы массивов, а internalProcessing возвращает массив, и вы поставите этот результат как элемент массива в массиве оберточной с этим:

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

Вместо этого вы должны сохранить результат internalProcessing следующим образом (в обеих случаях):

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

Это делает трюк, как вы можете видеть в этом fiddle.

+0

Не работал для меня, я получаю тот же массив массивов массивов, вы пробовали? – ReynierPM

+0

nvm, так как первый результат - это многомерный массив, то я изменил его с 'array_merge' на' array_merge_recursive', и это делает работу. Спасибо за головы! – ReynierPM

+0

В примере, который вы указали, нет необходимости в 'array_merge_recursive' (я добавил скрипку), но я рад, что это сработает для вас. – trincot

Смежные вопросы