2012-01-17 3 views
0

Названное может быть counfusing, я попытаюсь объяснить на примере:Разделить массив и добавить письмо в конце каждой части

У меня есть массив, содержащий все возможные 1326 стартовых рук в Texas Hold» em * отсортировано в порядке прочности. *

$array = array("AA","AA",..."KK","KK",..."AKs",.."AKo",..); 

Я хотел бы создать новый массив, разделив каждую руку в 2-х карт и добавить к ним буква (костюм). Скафандр являются 4: с, s, d, ч поэтому окончательный массив должен стать чем-то вроде:

$array1 = array(array("Ac","As"), array("As","Ad"),..., array("Ac","Kc"), array("Ac","Ks")); 

P.S. Когда в $ array я использую sintax AK s это означает тот же костюм, o означает offsuited.

Заранее спасибо

EDIT

$ array1 должна содержать все комбинации 1326 двух карт возможно с колодой из 52 карт. http://pastebin.com/kde4qjLD

Сортировка массива $ должна быть в порядке силы (ожидаемое значение каждой руки). Массив с правой порядка сортировки можно найти здесь: http://pastebin.com/ydfd08Cw

$array1 = array(
    array("As", "Ad"), 
    array("Ad", "Ac"), 
    array("Ac", "Ah"), 
    array("Ah", "As"), 
    array("As", "Ac"), 
    array("Ac", "Ad"), 
    array("As", "Ks"), 
    array("Ad", "Kd"), 
//etc 
); 
+1

Пожалуйста, опишите его больше. Техасский предмет локализован. Многие пользователи не поймут это. –

+0

Описано :) Надеюсь, теперь это становится яснее. – KingBOB

ответ

1
// our Card like Ah or 2c 
class Card { 

    /** 
    * @var string 'A','K','Q','J','T','9','8','7','6','5','4','3','2' 
    */ 
    public $sign; 

    /** 
    * @var string 'h','c','d','s' 
    */ 
    public $suit; 

    public function __construct($sign, $suit) { 
    $this->sign = $sign; 
    $this->suit = $suit; 
    } 

    public function __toString() { 
    return $this->sign.$this->suit; 
    } 

    /** 
    * Computes a unique-hash of two play cards 
    * 
    * returns something like AhAs (ordered by Sign of the Cards) 
    * if the sign of the cards is the same, it is ordered by suite 
    * 
    * every hash from a tupel of cards should return the same hash! 
    * @returns string 
    */ 
    public function hash(Card $cardB) { 
    $cardA = $this; 

    if ($cardA->sign === $cardB->sign) { 
     $cmp = strcmp($cardA->suit, $cardB->suit); 
    } else { 
     $cmp = strcmp($cardA->sign, $cardB->sign); 
    } 

    return $cmp > 0 
     ? $cardA.$cardB 
     : $cardB.$cardA 
    ; 
    } 
} 

// create all possible cards 
$cards = array(); 
foreach (array('A','K','Q','J','T','9','8','7','6','5','4','3','2') as $sign) { 
    foreach (array('h','c','d','s') as $suit) { 
    $cards[] = new Card($sign,$suit); 
    } 
} 

/* 
    create combinations from all cards ($card) with all cards ($secondcard) 
    we don't want to combine: 
    - cards which are the same 
    - cards which have alreay been combined (saved in index) 
*/ 
$index = array(); 
$combinations = array(); 
foreach ($cards as $card) { 
    foreach ($cards as $secondCard) { 
    if ($card !== $secondCard && !array_key_exists($hash = $card->hash($secondCard), $index)) { 
     $combinations[] = array($card, $secondCard); 
     $index[$hash] = TRUE; 
    } 
    } 
} 

// print results 
var_dump(count($combinations)); 
foreach ($combinations as $cards) { 
    print $cards[0].$cards[1]."\n"; 
} 

Я надеюсь, что комментарии объяснить, как это работает. Конечно, для этого есть более приятный (гораздо более сложный способ). «Ключ» в этом заключается в создании уникального хэша из двух карт, так что каждый кортеж с одних и тех же карт возвращает один и тот же хеш.

Надеется, что это помогает понять

P.S .: этого wasts времени + пространства, но это понятно

+0

Я тестирую его, он дает эту ошибку: Ошибка синтаксиса: ошибка синтаксиса, неожиданный T_FUNCTION в строке 77, возможно, потому что я используя PHP 5.2? Как я могу это решить? – KingBOB

+1

Я обновил исходный код, но вы могли бы понять это сами. –

+0

Спасибо за ваши усилия! Однако он должен вернуть отсортированный список из этих 1326 рук, порядок сортировки - тот, который указан в массиве $ (в порядке силы). Возможно, этот вопрос должен быть полезен http://stackoverflow.com/questions/8885412/sort-an-array-by-using-the-same-order-of-another-one – KingBOB

0
$newarray=array(); 
while (true) { 
    $a=array_shift($array); 
    if (!$a) break; 
    $b=substr($a,1); 
    $a=substr($a,0,1); 
    $newarray[]=array (
    $a.'c', $a.'s',$a.'d',$a.'h', 
    $b.'c', $a.'s',$b.'d',$b.'h' 
); 
} 
+0

Он возвращает ошибку во время ее запуска ... – KingBOB

+0

Исправлена ​​ошибка с запятой, теперь работает. –

1

Здесь вы идете:

$suits = array('c','s','d','h'); 
$faces = array('A','K','Q','J','10','9','8','7','6','5','4','3','2'); 
function generate_permutations($elems){ 
    $result = array(); 
    for ($i=0;$i<count($elems);$i++){ 
     for ($j=$i+1;$j<count($elems);$j++){ 
      $result[] = array($elems[$i],$elems[$j]); 
     } 
    } 
    return $result; 
} 

$cards = array(); 
foreach ($suits as $suit){ 
    foreach ($faces as $face){ 
     $cards[] = $face.$suit; 
    } 
} 
$new_array = generate_permutations($cards); 
+0

Я тестирую его, но не работает должным образом, так как он дает массив с дубликатами. Если есть «As» - «Ac», не должно существовать «Ac» - «As». Любая идея решить это? – KingBOB

+0

Я не совсем хорошо знаком с техасским холдемом, у него есть еще какие-то ограничения? – J0HN

+0

Нет, я думаю, что все! : D $ new_array должен состоять из 1326 разных рук. – KingBOB

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