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.