2016-06-09 21 views
0

저는 머리를 감싸려고하고 있지만 잃어버린 느낌입니다. 나는 구조의이 종류가있는 XML이 : 내가 필요로하는 출력의 일종이다PHP로 각 날짜마다 XML에서 각 ID가 얼마나 자주 발생하는지 계산합니다.

<Logs> 
    <Log> 
     <AppID>12345</AppID> 
     <Module>String</Module> 
     <Info>String</Info> 
     <Date>Datetime</Date> 
    </Log> 
    <Log> 
     ... 
    </Log> 
</Logs> 

,의 AppID가 기록 된 빈도를 매일에 있습니다. 뭔가 같은 :

20016-06-01: 12345: 5 times, 12557: 2 times 
20016-06-02: 12345: 3 times, 18949: 1 times 

이미 XML 파일을로드하고 그것을 통해 갈 simple_xml를 사용

$res = array(); 
foreach ($loadedxml->Logs->Log as $curLog) 
{ 
    if (!isset($res[(String)$curLog->Date])) 
     $res[(String)$curLog->Date] = array(); 

    $lstLogDate = &$res[(String)$curLog->Date]; 
    if (!isset($lstLogDate[(String)$curLog->AppID]) 
     $lstLogDate[(String)$curLog->AppID] = 0; 

    $lstLogDate[(String)$curLog->AppID]++; 
} 

이 : PHP로

foreach ($loadedxml->Log as $error){...} 
+0

그래서 정확히 무엇을 시도 했습니까? foreach는 훌륭하지만 모든 것이 문제의 가장 단순한 부분입니다. –

+0

모든 발생 날짜 (! in_array)로 배열을 만들었지 만, 지금은 각 날짜에 대한 각 AppID의 수를 가져 와서 날짜로 참조 할 수는 없습니다. –

답변

0

, 해시 테이블은 종종 해답 코드는 모든 날짜가 키로 된 해시 테이블을 만들고 각 항목에 대해 키로 id를 채운 목록 채우기가 있고 값으로 숫자가 발생합니다. XSLT 1.0 그룹핑에 대한 Muenchian Method

foreach ($res as $dateValue => $lstId) 
{ 
    echo $dateValue . ": "; 

    foreach ($lstId as $id => $countId) 
    echo $id . ": " . $countId . "times"; 

    echo "\n"; 
} 
+0

문자열에 simplexml 객체를 캐스팅해야하고 하나의 검사를 수행 할 수 있습니다. – splash58

+0

참 ... 죄송합니다 잊어 버렸습니다 :/ –

+0

작동해야합니다. 지금까지 감사드립니다. 하지만 마지막 부분은 나를 위해 결과를 생성하지 않는 것 같습니다. 나는 단지 "2016-06-01 :"(등등)을 얻었지만 ":"을 지나치지 않았다. –

0

전형적인 예 : 다음 코드는 결과를 나타낸다. 정보로서 XSLT (스크립트가 형식이 올바른 XML 문서 임)는 XML 파일을 변환하는 데 사용되는 특수 용도의 언어입니다. PHP는 가장 일반적인 목적 언어처럼 XSLT 1.0 프로세서를 유지 관리합니다.

이하 XSLT 스크립트는 을 <AppID><Date>을 연결하여 실행 한 다음 다른 그룹 값을 계산합니다. 사실, XSLT는 for 루프없이 문자열 라인을 출력 할 수 있습니다!

XML 입력 (재현 예를 들어)

<Logs> 
    <Log> 
     <AppID>12345</AppID> 
     <Module>Falcon</Module> 
     <Info>Avengers Assemble</Info> 
     <Date>2016-06-01</Date> 
    </Log> 
    <Log> 
     <AppID>12345</AppID> 
     <Module>Captain America</Module> 
     <Info>Avengers Assemble</Info> 
     <Date>2016-06-01</Date> 
    </Log> 
    <Log> 
     <AppID>12557</AppID> 
     <Module>Black Widow</Module> 
     <Info>Avengers Assemble</Info> 
     <Date>2016-06-01</Date> 
    </Log> 
    <Log> 
     <AppID>12345</AppID> 
     <Module>Iron Man</Module> 
     <Info>Avengers Assemble</Info> 
     <Date>2016-06-02</Date> 
    </Log> 
    <Log> 
     <AppID>12557</AppID> 
     <Module>Hulk</Module> 
     <Info>Avengers Assemble</Info> 
     <Date>2016-06-02</Date> 
    </Log> 
    <Log> 
     <AppID>12557</AppID> 
     <Module>Blackhawk</Module> 
     <Info>Avengers Assemble</Info> 
     <Date>2016-06-01</Date> 
    </Log> 
    <Log> 
     <AppID>12345</AppID> 
     <Module>Thor</Module> 
     <Info>Avengers Assemble</Info> 
     <Date>2016-06-01</Date> 
    </Log> 
</Logs> 

XSLT 스크립트

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" /> 
<xsl:strip-space elements="*"/> 

<xsl:key name="appkey" match="Log" use="concat(AppID, Date)" /> 

    <xsl:template match="Logs">   
     <xsl:apply-templates select="Log[generate-id() = 
             generate-id(key('appkey',concat(AppID, Date))[1])]"> 
     <xsl:sort select="concat(Date, AppID)"/> 
     </xsl:apply-templates>   
    </xsl:template> 

    <xsl:template match="Log[generate-id() = 
          generate-id(key('appkey',concat(AppID, Date))[1])]">  
     <xsl:value-of select="concat(Date, ': ', AppID, ' ', 
          count(. | key('appkey', concat(AppID, Date))), ' times')"/> 
    <xsl:text>&#xA;</xsl:text> 
    </xsl:template> 

</xsl:transform> 

PHP 스크립트 (같은 끝내고 .xsl 문서를 저장 한 다음로드 할)

// LOAD XML AND XSL FILES 
$xmlfile = new DOMDocument('1.0', 'UTF-8'); 
$xmlfile->load('Input.xml'); 

$xslfile = new DOMDocument('1.0', 'UTF-8'); 
$xslfile->load('XSLTScript.xsl'); 

// TRANSFORM XML with XSLT 
$proc = new XSLTProcessor; 
$proc->importStyleSheet($xslfile); 
$newXml = $proc->transformToXML($xmlfile); 

// ECHO OUTPUT STRING 
echo $newXml; 

# 2016-06-01: 12345 3 times 
# 2016-06-01: 12557 2 times 
# 2016-06-02: 12345 1 times 
# 2016-06-02: 12557 1 times 
관련 문제