2014-11-21 3 views
2

Я пытаюсь понять способ заставить это работать. Но мне сложно размышлять над логикой.php многомерный массив цикл контура сегмента цикл

У меня есть этот массив:

Array 
(
    [0] => Array 
     (
      [0] => news 
      [1] => {section} 
      [2] => {slug} 
      [3] => {*} 
     ) 

    [1] => Array 
     (
      [0] => {id} 
      [1] => {*} 
     ) 

    [2] => Array 
     (
      [0] => {date} 
      [1] => 25-07-1982 
      [2] => {section} 
      [3] => {slug} 
      [4] => {*} 
     ) 

) 

Что мне нужно преобразовать к такому результату:

0 news/{id}/{date} 
1 news/{id}/25-07-1982 
2 news/{id}/{section} 
3 news/{id}/{slug} 
4 news/{id}/{*} 
5 news/{*}/{date} 
6 news/{*}/25-07-1982 
7 news/{*}/{section} 
8 news/{*}/{slug} 
9 news/{*}/{*} 
10 {section}/{id}/{date} 
11 {section}/{id}/25-07-1982 
12 {section}/{id}/{section} 
13 {section}/{id}/{slug} 
14 {section}/{id}/{*} 
15 {section}/{*}/{date} 
16 {section}/{*}/25-07-1982 
17 {section}/{*}/{section} 
18 {section}/{*}/{slug} 
19 {section}/{*}/{*} 
20 {slug}/{id}/{date} 
21 {slug}/{id}/25-07-1982 
22 {slug}/{id}/{section} 
23 {slug}/{id}/{slug} 
24 {slug}/{id}/{*} 
25 {slug}/{*}/{date} 
26 {slug}/{*}/25-07-1982 
27 {slug}/{*}/{section} 
28 {slug}/{*}/{slug} 
29 {slug}/{*}/{*} 
30 {*}/{id}/{date} 
31 {*}/{id}/25-07-1982 
32 {*}/{id}/{section} 
33 {*}/{id}/{slug} 
34 {*}/{id}/{*} 
35 {*}/{*}/{date} 
36 {*}/{*}/25-07-1982 
37 {*}/{*}/{section} 
38 {*}/{*}/{slug} 
39 {*}/{*}/{*} 

Массив ввода может содержать более чем три ключа, поэтому решение я ищу должен быть динамичным. И результат должен иметь тот же порядок, что и результат, показанный выше. Кто-нибудь знает, как это сделать эффективным образом? Может ли кто-нибудь дать мне толчок в правильном направлении? Большое спасибо! :)

+0

Поместите «перестановки php» на http://google.com – zerkms

+0

Я думаю, что все, что вам нужно, это 3 вложенных цикла – Serpes

+0

@Serpes Да, я вижу это сейчас, спасибо! –

ответ

3

Sth как этот

foreach ($array[0] as $val0) 
    foreach ($array[1] as $val1) 
    foreach ($array[2] as $val2) 
     $newArray[] = "$val0/$val1/$val2"; 

EDIT: для переменной длины массива

function recursive($array , $length = 0){ 
    $retval =array(); 

    if($length < count($array) -1){ 
    foreach ($array[$length] as $val0) 
     foreach (recursive($array, $length+1) as $val1) 
      $retval[] = "$val0/$val1"; 
    } 
    else 
    { 
    foreach ($array[$length] as $val0) 
     $retval[] = "$val0"; 
    } 

    return $retval; 
} 

print_r(recursive($array)); 
+0

Ой, что на самом деле доставит меня туда! Смотря на это в течение часа, но не видел этого: S. Время на выходных ... Думаю, что входной массив может быть больше трех, но я думаю, что с некоторой рекурсией я должен уметь это работать! –

+0

Хмм, я не могу сделать это рекурсивным. Есть идеи? –

+0

Я добавил рекурсивную функцию –

0

Просто потому, что мне нравится писать функции, которые неправильно/управления PHP массивы, я ставлю это вместе, в основном потому, что я был уверен, что вы можете избежать рекурсии —, потому что сама структура не рекурсивна. (Моя голова кажется, что это правило, я уверен, что кто-то может доказать это неправильно).

foreach (array_reverse($array) as $sub) { 
    if (isset($rem)) { 
    $ret = array(); 
    foreach ($sub as $itm) { 
     foreach ($rem as $val) { $ret[] = "$itm/$val"; } 
    } 
    $rem = $ret; 
    } 
    else { 
    $rem = $sub; 
    } 
} 

Выход найден в $rem выглядит следующим образом:

Array (
    [0] => news/{id}/{date} 
    [1] => news/{id}/25-07-1982 
    [2] => news/{id}/{section} 
    [3] => news/{id}/{slug} 
    [4] => news/{id}/{*} 
    [5] => news/{*}/{date} 
    [6] => news/{*}/25-07-1982 
    [7] => news/{*}/{section} 
    [8] => news/{*}/{slug} 
    [9] => news/{*}/{*} 
    [10] => {section}/{id}/{date} 
    [11] => {section}/{id}/25-07-1982 
    [12] => {section}/{id}/{section} 
    [13] => {section}/{id}/{slug} 
    [14] => {section}/{id}/{*} 
    [15] => {section}/{*}/{date} 
    [16] => {section}/{*}/25-07-1982 
    [17] => {section}/{*}/{section} 
    [18] => {section}/{*}/{slug} 
    [19] => {section}/{*}/{*} 
    [20] => {slug}/{id}/{date} 
    [21] => {slug}/{id}/25-07-1982 
    [22] => {slug}/{id}/{section} 
    [23] => {slug}/{id}/{slug} 
    [24] => {slug}/{id}/{*} 
    [25] => {slug}/{*}/{date} 
    [26] => {slug}/{*}/25-07-1982 
    [27] => {slug}/{*}/{section} 
    [28] => {slug}/{*}/{slug} 
    [29] => {slug}/{*}/{*} 
    [30] => {*}/{id}/{date} 
    [31] => {*}/{id}/25-07-1982 
    [32] => {*}/{id}/{section} 
    [33] => {*}/{id}/{slug} 
    [34] => {*}/{id}/{*} 
    [35] => {*}/{*}/{date} 
    [36] => {*}/{*}/25-07-1982 
    [37] => {*}/{*}/{section} 
    [38] => {*}/{*}/{slug} 
    [39] => {*}/{*}/{*} 
) 

Кроме того, для тех, кто любит их массивы многомерные, это может пригодиться (хотя я не хотел бы думать, что накладные расходы являются для такой версии для игры в гольф). Чтобы быть ясным, этот второй пример не создает список строк в соответствии с запросом OP, а иерархическую структуру массива.

foreach (array_reverse($array) as $sub) { 
    $rem = isset($rem) 
    ? array_combine($sub, array_fill(0, count($sub), $rem)) 
    : $sub 
    ; 
} 

Это порождает (опять же в $rem):

Array (
    [news] => Array (
     [{id}] => Array (
      [0] => {date} 
      [1] => 25-07-1982 
      [2] => {section} 
      [3] => {slug} 
      [4] => {*} 
     ) 
     [{*}] => Array (
      [0] => {date} 
      [1] => 25-07-1982 
      [2] => {section} 
      [3] => {slug} 
      [4] => {*} 
    ) 
    ) 

    [{section}] => Array (
     [{id}] => Array (
      [0] => {date} 
      [1] => 25-07-1982 
      [2] => {section} 
      [3] => {slug} 
      [4] => {*} 
     ) 

... and so on 

Теперь, если только PHP был join_recursive, который включал ключи.
(это было бы почти бессмысленно, за исключением помощи с вышеуказанным).

+0

О! Отлично, я только сейчас вижу это. Посмотрите, могу ли я использовать это для хорошего использования. Благодаря! –

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