[英]How do I programmatically generate an array of all permutations of a string pattern?
[英]Array permutations as i need
你們中的任何人都可能已經完成了我在下面提到的這種組合。
$data = array
(
'a1' => array(7, 32,44),
'a2' => array(4,44),
'a3' => array(9,33,55)
);
如果我嘗試檢索n次,則返回應該是這樣的。 假設n = 4(o到3)。
Array
(
[0] => Array
(
[0] => 7 // from a1
[1] => 4 // from a2
[2] => 9 // from a3
)
[1] => Array
(
[0] => 32
[1] => 44
[2] => 33
)
[2] => Array
(
[0] => 44
[1] => 4
[2] => 55
)
[3] => Array
(
[0] => 7
[1] => 44
[2] => 9
)
)
等等....
%
操作是你的朋友:
function foo($arr, $n) {
$result = array();
for ($i = 0; $i < $n; $i++) {
$result[$i] = array_map(function($value) use ($i) {
return $value[$i % count($value)];
}, $arr);
}
return $result;
}
// usage:
var_dump(foo($data, 4));
解決這個問題的一個有趣方法是使用MultipleItator()
:
$iterator = new MultipleIterator;
array_walk($data, function(array $item) use ($iterator) {
// attach infinite iterators for each element
$iterator->attachIterator(new InfiniteIterator(new ArrayIterator($item)));
});
它使用InfiniteIterator
在每個數組到達末尾時回放它。 這也意味着整個迭代器是無限的; 使用foreach
直到你殺死腳本,所以你必須使用for
循環:
$iterator->rewind()
for ($i = 0; $i < 4; ++$i) {
print_r($iterator->current());
$iterator->next()
}
順便說一句,你不能在這里使用LimitIterator
來選擇前四項,因為如果你這樣做會拋出通知。
我將把這個操作稱為“模塊化拉鏈”,因為它的工作方式與Python的zip
功能類似,包裹在前面。 使用數組next
函數而不是數字模運算符,這個運算速度明顯更快。
$array_list
應該是一個數組列表; 沒有執行數據類型檢查。
<?php
function zip_modular($len, $array_list) {
$out = array();
for($n = 0; $n < $len; $n++) {
$out[$n] = array();
foreach($array_list as &$arr) {
$cur = current($arr);
if(empty($cur)) {
reset($arr);
}
$out[$n][] = current($arr);
next($arr);
}
}
return $out;
}
// example
print_r(zip_modular(4, [[7, 32, 44], [4, 44], [9, 33, 55]]));
/*
Array
(
[0] => Array
(
[0] => 7
[1] => 4
[2] => 9
)
[1] => Array
(
[0] => 32
[1] => 44
[2] => 33
)
[2] => Array
(
[0] => 44
[1] => 4
[2] => 55
)
[3] => Array
(
[0] => 7
[1] => 44
[2] => 9
)
)
*/
嘗試這個
function sample($len, $array_list) {
$out = array();
//print_r($array_list);
$num_arrs = count($array_list);
for($n = 0; $n < $len; $n++) {
$out[$n] = array();
for($i = 1; $i <= $num_arrs; $i++) {
// $array_list['a1'.$i];
$cur = current($array_list['a'.$i]);
if(empty($cur)) {
reset($array_list['a'.$i]);
}
$out[$n][] = current($array_list['a'.$i]);
next($array_list['a'.$i]);
}
}
return $out;
}
// example
print_r(sample(4, $data));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.