2012-02-21 5 views
0

그래서 $ array 배열에있는 "variables"를 $ marketArray의 값으로 대체하는 두 개의 배열을 병합하는 함수가 있습니다. 일종의 기여자가 작성한 멋진 코드입니다. 이제는 새로운 요구 사항으로 인해 작업을 약간 전환해야합니다.PHP 배열의 키 조작

먼저 하나의 큰 배열에 하나의 거대한 목록 대신 시장별로 물건을 그룹화하는 배열로 만들 필요가 있습니다. 둘째, 새 배열의 키가 시장 카운터 형식이어야합니다.

gb/en-1, gb/en-2 등 (이것은 JQuery가 나중에 결과가 어디에서 나올지를 결정하는 데 사용할 수있는 ID를 얻습니다.) 따라서 나는 몇 가지 새로운 항목을 입력했습니다. NEW) 시장의 가치를 얻고 카운터를 시작했는데 내 두뇌가 다음 단계로 비틀어졌다.

$ marketArray는 이와 같은 시장의 다차원 결합 배열이다 (그러나 더 많은 시장!).

$markets = array(
array(market => 'se/sv', storeid => 'storeId=66', langid => 'langId=-14', storenumber => '109', prodid => '741586', artid => '22112334'), 
array(market => 'at/de', storeid => 'storeId=82', langid => 'langId=-11', storenumber => '234', prodid => '374637', artid => '45678214') 
); 

$ 템플릿 (다시 단축) 시장별로 시장을 조작 할 필요가 URL 템플릿의 무리입니다

여기
$template = array (
    '/$market', 
    '/$market/catalog/', 
    '/$marketproducts/$artid', 
    'StockSearchForm?&productId=$prodid' 
); 

6,그래서 내가 무엇을 달성하려고하는 대신 시장 카운터 시장별로 그룹화

$urlstohit (
[0] => '/se/sv/catalog/categories/', 
[1] => '/se/sv/catalog/news/', 
[2] => '/se/sv/catalog/categories/departments/', 
[3] => '/se/sv/search/?query=giant' 
[4] => '/at/de/catalog/categories/', 
[5] => '/at/de/catalog/news/', 
[6] => '/at/de/catalog/categories/departments/', 
[7] => '/at/de/search/?query=giant' 
) 

MD의 배열과 같은 하나 개의 거대한 배열입니다 기능

function urlBuilder($marketArray,$template) { 
$urlstohit=array(); 
foreach ($marketArray as $m) { 
$market = $m['market']; //NEW 
$counter = 1; //NEW 
    foreach ($template as $t) { 
     $tt=$t; 
     foreach ($m as $k=>$v) 
      $tt=str_replace('$'.$k, $v, $tt); 
      $urlstohit[]=$tt; 
    } 
} 
return ($urlstohit); 
} 

입니다 키로

$urlstohit (
    ['se/sv'] => array(
    ['se/sv-1'] => '/se/sv/catalog/categories/', 
    ['se/sv-2'] => '/se/sv/catalog/news/', 
    ['se/sv-3'] => '/se/sv/catalog/categories/departments/', 
    ['se/sv-4'] => '/se/sv/search/?query=giant' 
    ), 
    ['at/de'] => array(
    ['at/de-1'] => '/at/de/catalog/categories/', 
    ['at/de-2'] => '/at/de/catalog/news/', 
    ['at/de-3'] => '/at/de/catalog/categories/departments/', 
    ['at/de-4'] => '/at/de/search/?query=giant' 
    ) 
) 
+0

루프가 너무 많습니다. 'array_walk_recursive'를 사용하는 것은 어떻습니까? 배열이 아닌 특정 요소로 작업하는 것이 더 쉬울 것입니다. – YuS

+0

모든 언어로 복잡한 배열 시나리오를 사용하여 php에 솔직히 익숙해졌습니다. 따라서 array_walk_recursive에 대해서는 아무 것도 몰랐습니다. 지금 나는 그렇게한다. @liquorvicar로부터 좋은 대답을 얻었지만, 나에게 유용 할 것이다. 그래서 새로운 것을 보아 주셔서 감사합니다! – Seer

답변

2

시도해보기

function urlBuilder($marketArray,$template) { 
    $urlstohit=array(); 
    foreach ($marketArray as $m) { 
     $market = $m['market']; 
     $counter = 1; 
     $urlstohit[$market] = array();/ADDED 
     foreach ($template as $t) { 
      $tt=$t; 
      foreach ($m as $k=>$v) 
       $tt=str_replace('$'.$k, $v, $tt); 
       $urlstohit[$market][$market.'-'.$counter]=$tt; // EDITED 
       $counter++; // ADDED 
      } 
     } 
    } // ADDED 
    return ($urlstohit); 
} 

내가 추가하고 편집 한 행을 표시했습니다 (나는 중괄호도 누락 된 것 같습니다).

+0

와우 - 아름답게 작동합니다! 많은 많은 감사합니다! 배열은 내 머리를 다치게하고 - 당신이 쓴 것을 보았을 때 모든 것이 완벽하게 이해되지만 LOL을 알아 내는데 많은 시간이 걸렸을 것입니다 :) – Seer