2015-10-09 3 views
2

Я пытаюсь сделать простой скрипт PHP для школы. Мне нужно вывести 2 случайных студентов из массива $leerlingen (Leerlingen = students).Как я могу вывести 2 случайных значения из массива?

Работает нормально, когда я использую echo $leerlingen внутри цикла foreach, но когда я использую оператор return, он прекращает выполнение, потому что, когда используется возврат, он завершает функцию.

Код:

$leerlingen = array("tobias", "hasna", "aukje", "fred", "sep", "koen", "wahed", "anna", "jackie", "rashida", "winston", "sammy", "manon", "ben", "karim", "bart", "lisa", "lieke"); 
shuffle($leerlingen); 

function maakGroepjes($leerlingen) { 
    $begin = 1; 
    foreach ($leerlingen as $leerling) { 
     if ($begin <= 2) { 
      echo $leerling; 
      $begin++; 
     } 
    } 
} 

echo maakGroepjes($leerlingen); 

Может кто-нибудь сказать мне, как решить эту проблему?

+2

Google: 'PHP array_rand()' – Rizier123

+0

"как решить эту проблему?" --- используйте 'echo', как вы использовали раньше. – zerkms

+0

Thaks Zerkms. Но мой учитель сказал мне, что мне нужно использовать возврат при использовании функции? Какая разница? – Arnold

ответ

1

Вы можете вернуть только одно значение внутри функции, в этом случае это массив. Я предполагаю, что массив имеет как минимум два значения.

<?php 

$leerlingen = array(
    "tobias", "hasna", "aukje", "fred", "sep", "koen", "wahed", "anna", "jackie", "rashida", "winston", "sammy", "manon", "ben", "karim", "bart", "lisa", "lieke" 
); 
shuffle($leerlingen); 

function maakGroepjes($leerlingen) { 
    //your result array 
    $result = array(); 
    //Picking 2 random entries out of an array to $keys 
    $keys = array_rand($leerlingen, 2); 
    //Returning the array with two values 
    return array($leerlingen[$keys[0]], $leerlingen[$keys[1]]); 
} 

//assign the values to the vars 
list($one, $two) = maakGroepjes($leerlingen); 

//printing 
echo $one . "<br>\n"; 
echo $two . "<br>\n"; 

?> 
+0

Спасибо за ваше четкое объяснение :) – Arnold

+0

@ArnoldHofman, если мой ответ поможет вам не забыть проверить, как принято, если вы не знаете, как читать этот http://stackoverflow.com/tour –

-1

Попробуйте это:

if ($begin <= 2) { 
    echo $leerling; 
    $begin++; 
} else { 
    return 
} 

Что это делает: каждый раз через петлю, он смотрит на $ начать. Если он меньше или равен двум, он вторит этому ученику и увеличивает $ begin. Иначе, если он больше двух, он возвращает, заканчивая функцию (и, следовательно, цикл).

возможно лучший способ сделать это было бы просто посмотреть на порядковый непосредственно:

foreach ($leerlingen as $ord => $leerling) { 
    echo $leerling; 
    if ($ord == 1) return; 
} 

Обратите внимание на синтаксисе в определении цикла. Часть «old =>» задает порядковое значение как переменную, когда вы зацикливаетесь, чтобы вы могли видеть, какую запись в массиве, в котором вы сейчас находитесь. Таким образом, это просто проходит через печать студентов. Когда он напечатал второго ученика (помните, что массивы подсчитываются 0, 1, 2 ...), он возвращается.

Кроме того, вы, вероятно, не хотите echo maakGroepjes(). Эта функция - это то, что вторит именам учеников. Вероятно, вы не хотите повторять результат функции, если функция не компилирует имена в строку и не возвращает строку или что-то еще.

0

Вы всегда можете попробовать что-то вроде этого.

function maakGroepjes($leerlingen) { 
    do { 
     $first_student = array_rand($leerlingen); 
     $second_student = array_rand($leerlingen); 
    } while ($leerlingen[$first_student] == $leerlingen[$second_student]); 
    return [$leerlingen[$first_studen], $leerlingen[$second_student]]; 
} 

Что возвращает это.

Array 
(
    [0] => manon 
    [1] => winston 
) 

Кроме того, разница между функцией печати/эхо-информации и возвращаемой информацией является довольно большой.

Вы не можете назначить переменную для оператора echo внутри функции, тогда как вы можете назначить переменную команде return.

+0

Почему это было забито? – zerkms

1

array_rand и другие функции (rand), которые полагаются на libc, имеют плохой стандартный дистрибутив. Я всегда рекомендую использовать mt_rand(), если вам нужно, чтобы он был равномерно распределен, иначе некоторые записи будут в значительной степени благоприятствовать.

Это хорошая легкая замена для числовых массивов:

function array_mt_rand($array) { 
    return $array[ mt_rand(0, count($array)-1) ]; 
} 
$one = array_mt_rand($array); 
$two = array_mt_rand($array); 

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

+0

Ваш код может повторить возвращаемое значение дважды. –

+0

@AdrianCidAlmaguer, да, как я сказал в последнем предложении. Более просто показываем более точную замену array_rand. – Devon

0

Я бы подошел к этому несколько иначе.

function maakGroepjes($leerlingen) { 
    shuffle($leerlingen);    // randomize the list of students 
    return array_chunk($leerlingen, 2); // break in into groups of two and return it 
} 

Затем с

$groepjes = maakGroepjes($leerlingen); 

вы можете создать все группы сразу. Не беспокойтесь о повторении. Таким образом, если вам нужно несколько групп, вы можете перебирать список групп. Если вам действительно нужна только одна группа из двух человек, то это будет

$groepjes[0]; 

, который вы можете использовать, как вам нравится. Очень простой пример:

foreach ($groepjes[0] as $student) echo "$student<br>";