2016-11-30 6 views
0

Мой вопрос может звучать глупо, но я знаю, что это можно сделать. Я на самом деле пытаюсь сделать массив из mysql отличным от массива, который у меня есть shuffle. Я хочу сохранить ключи массива, просто значение в другом порядке.2 разных массива с различными значениями

Вот пример,

Массив из MYSQL:

Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 4 
    [4] => 5 
    [5] => 6 
    [6] => 7 
    [7] => 8 
) 

Массив после shuffle:

Array 
(
    [0] => 3 
    [1] => 7 
    [2] => 8 
    [3] => 4 
    [4] => 1 
    [5] => 2 
    [6] => 5 
    [7] => 6 
) 

Если вы заметили, MYSQL array ключ 3 имеет то же значение как shuffle array, я хочу, чтобы это было diff различны. Как я могу это сделать?

Вот мой код:

function get_random_elements($array) { 
    $ori_array = $array; 

    echo "<pre>"; 
    print_r($ori_array); 
    echo "</pre>"; 

    shuffle($array); 

    echo "<pre>"; 
    print_r($array); 
    echo "</pre>"; 

    for($x=0; $x<count($array); $x++) { 
     if ($array[$x] == $ori_array[$x]) 
     { 
      $dupliarray[] = "Array value: ".$array[$x]." Key :".$x; 
      unset($array[$x]); 
     } 

    } 

    echo "<pre>"; 
    print_r($dupliarray); 
    echo "</pre>"; 

} 

$mysql_array = array(0=>'1',1=>'2',2=>'3',3=>'4',4=>'5',5=>'6',6=>'7',7=>'8'); 

get_random_elements($mysql_array); 
+0

Вызывает функцию 'get_random_elements' рекурсивно u ntil (который является count ($ dupliarray) равен 0), вы получаете совершенно другой массив из исходного массива. – Naga

+0

@Naga Хм ... правда, но как я могу назвать рекурсивно? – MuthaFury

ответ

2

Одним из решений может быть перетасовать массив, пока он не стал полностью отличаться от исходного массива:

$sourceArray = [0, 1, 2, 3, 4, 5, 6, 7, 8]; 
$shuffledArray = $sourceArray; //because function shuffle will change passed array 

shuffle($shuffledArray);  
while (count(array_intersect_assoc($sourceArray, $shuffledArray))) { 
    shuffle($shuffledArray); 
} 

echo '<pre>'; 
var_dump($sourceArray, $shuffledArray); 
0

Я предлагаю такой вариант: Code in sandbox

$startArray = [ 
    0 => 1, 
    1 => 2, 
    2 => 3, 
    3 => 4, 
    4 => 5, 
    5 => 6, 
    6 => 7, 
    ]; 

function getShuffledArray($startArray) { 

    $shuffledArray = []; 

    // save value of last element for situation when we have last 2 elements of start array and one of them - last 
    $lastElement = end($startArray); 

    while (count($startArray)) { 
     $candidateIndex = array_rand($startArray); 
     if ($candidateIndex == count($shuffledArray)) { 
      while ($candidateIndex == count($shuffledArray)) { 
       $candidateIndex = array_rand($startArray); 
      } 
     } 
     $shuffledArray[] = $startArray[$candidateIndex]; 
     unset($startArray[$candidateIndex]); 

     // shuffle last two elements when one of them last (in start array) 
     if (count($startArray) == 2 && end($startArray) == $lastElement) { 
      $shuffledArray[] = end($startArray); 
      $shuffledArray[] = reset($startArray); 
      $startArray = []; 
     } 
    } 

    return $shuffledArray; 
} 

$shuffledArray = getShuffledArray($startArray); 
print_r ($shuffledArray); 
Смежные вопросы