bir anahtar haline bir dize bölmek =>

1 Cevap php
+2-1+18*+7-21+3*-4-5+6x29

Yukarıdaki string bir anahtar => değer dizi ya da benzer bir şey ya bölmek çalışıyveyaum dize tür bir örnektir. Dize ve sürükle bırak yoluyla kullanıcı tarafından düzenlenebilir bir intranet sitesi, üç sütun sayfada çeşitli sınıfların düzenini temsil etmek için kullanılır. Bu dize, bir sonraki ziyaretinizde kullanılmak üzere bir çerez saklanır.

Sayılar bir sınıf kimliği temsil eden ve -, + ve x (genişletilmiş veya gizli minimize) sınıfının durumunu temsil, * sütun sonunu gösterir.

Ben 3 $ anahtar => $ değer dernekler ile dizi verir ve hangi patlayabilir kullanarak kolayca sütuna bu ayırabilirsiniz.

örn.

$column_layout = array( [0] => '+2-1+18' , [1] => '+7-21+3' , [2] => '-4-5+6x29' )

Ben daha sonra birlikte durumu ve kimliği tutarak, veyaadan çeşitli sınıflara bu bölmeniz gerekir. Farklı sınıflar ve durumları kullanıcıdan kullanıcıya ve kaç her sütun için vardır değişecek gibi, tüm otomatik olarak yapmak gerekiyveya.

örn.

$column1 = array( '+' => 2 , '-' => 1 , '+' => 18 )
...

veya

$column1 = array( array( '+' , 2 ) , array( '-' , 1 ) , array( '+' , 18 ) )
...

Ben oldukça bu yuvarlak başımı alamıyorum ve bunu yapmak için en iyi yolu nedir, bu nedenle herhangi bir yardım çok takdir.

1 Cevap

Sınırlayıcı ile ilk explode() dizisi *

Daha sonra patladı dizideki her bir öğeyi maç için preg_match_all kullanabilirsiniz. Böyle bir şey sizin örnek girişi ile çalışır.

$layout = explode('*', $input);
$columns = array();
foreach ( $layout as $item ){
    $parts = array();

    //matches either a -, x or + followed by one or more digits
    preg_match_all('/([+-x])(\d+)/', $item, $matches, PREG_SET_ORDER);

    foreach ( $matches as $match){ 
        //match[1] hold the + or -, match[2] holds the digits
        $parts[] = array($match[1], $match[2]);
    }
    $columns[] = $parts;
}

Örnekten çıktısı bu gibi biter:

array(
     array( array('+', '2'), array('-', '1'), array('+', '18') ),
     array( array('+', '7'), array('-', '21'), array('+', '3') ),
     //etc
);

PHP 5.3 ile (denenmemiş) böyle bir şey kullanabilirsiniz. Ana fark, iç döngü array_map which removes the need for a lot of lines of code. (Array map applies a function to every item in an array and returns the transformed array). PHP 5.3 is required for the nice closure syntax ile ikame edilmiş olmasıdır

$layout = explode('*', $input);
$columns = array();
foreach ( $layout as $item ){
    preg_match_all('/([+-x])(\d+)/', $item, $matches, PREG_SET_ORDER);
    $columns[] = array_map( function($a){ return array($a[1], $a[2]); },
                            $matches);
}

Ayrıca tamamen döngüler kaldırabilirsiniz:

$innerMatch = function($item){
    preg_match_all('/([+-x])(\d+)/', $item, $matches, PREG_SET_ORDER);
    return array_map( function($a){ return array($a[1], $a[2]); },
                      $matches);
};
$columns = array_map($innerMatch, explode('*', $input));

Ancak bu bunu kullanarak tavsiye etmem neden çoğu PHP geliştiriciler için çok okunabilir olmama büyük dezavantajı vardır.


More explanation

@Christopher Altman isteği

PHP 5.3 sürümünde yalnızca yeni gerçekten biraz şudur:

array_map(
          function($a){ return array($a[1], $a[2]); },
          $matches
);

(Örnek olarak) biraz genişletilmesi ve değiştirmeden

//bind an anonymous function to the variable $func
$func = function($a){
    return $a*$a; 
}; 
//$func() now calls the anonymous function we have just defined

//then we can call it like so:
$result = array_map($func, $myArray);

Yani $myArray olarak tanımlanır ise

array(1,2,3,4);

Bu dizi harita işlevi ile çalıştırdığınızda size dönüştürerek olarak bunu düşünebilirsiniz

array(func(1),func(2),func(3),func(4));

Ancak PHP değil gibi bir lazy language, tüm fonksiyonları kısa sürede bunlar karşılaştı gibi değerlendirilir, bu nedenle dizi olarak array_map döndürülür:

array(2, 4, 9, 16)

Gerçek kodda, preg_match_all maçları bir dizi (maçı diziler nerede) döndürür. Peki ben tüm dizi çekmek ve her maçta istenilen formatta farklı bir diziye maçı dönüştüren bir fonksiyon uygulayınız.