Yüzdesine negatif tamsayılar

2 Cevap php

Ben temel matematik fonksiyonlarını kullanarak yüzdelere dönüştürmek için veri dosyaları bir şey var:

<param id="1" name="otb" value="0.160"/>
<param id="2" name="blm" value="-0.210"/>
<param id="3" name="mep" value="-0.010"/>
<param id="4" name="plc" value="-0.100"/>

Her ID Yol adlı bu kendi denklemi:

  1. (N-(- .3)) / 2,3 * 100
  2. (N-(- 0,8)) / 3.3 x 100
  3. (N-(- .5)) / 1,5 * 100
  4. (N-(0,1)) / 1.1 x 100

Yani olsun:

otb=8 blm=20 mep=24 plc=0

Ne ile ... regex ve php, bütün bu dosyaları çalıştırmak için iyi bir yol olurdu? Orada herhangi bir hızlı ve kirli kod? : D

2 Cevap

Dosya XML formatında gibi görünüyor, ben PHP SimpleXML kütüphanesi denemenizi öneririz. Belgeler bulunabilir here.

Daha sonra sadece XML nesnesinin sihirli özelliklerine erişerek XML ağacını erişebilirsiniz:

$xml = simplexml_load_file('your/path/to/your/file');

foreach ($xml->param as $param)
{
    $id = $param['id'];
    $name = $param['name'];
    $value = $param['value'];

    // do your calculations...
}

Stil sihirli:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <xsl:output indent="yes" standalone="yes" omit-xml-declaration="yes" method="xml"/>
  <xsl:template match="*">
    <xsl:copy>
      <xsl:variable name="Values" select="@*[(name(..)='param') and ((name(.)='value'))]"/>
      <xsl:variable name="NonValues" select="@*[. != $Values]"/>
      <xsl:apply-templates select="$NonValues" mode="NonValues"/>
      <xsl:apply-templates select="$Values" mode="Values"/>
      <xsl:choose>
        <xsl:when test="*">
          <xsl:apply-templates select="*"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="."/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="@*" mode="Values">
    <xsl:attribute name="value"><xsl:variable name="n" select="."/><xsl:choose><xsl:when test="../@id=1"><xsl:value-of select="(($n - (-0.3)) div 2.3) * 100"/></xsl:when><xsl:when test="../@id=2"><xsl:value-of select="(($n - (-0.8)) div 3.3) * 100"/></xsl:when><xsl:when test="../@id=3"><xsl:value-of select="(($n - (-0.5)) div 1.5) * 100"/></xsl:when><xsl:when test="../@id=4"><xsl:value-of select="(($n - (0.1)) div 1.1) * 100"/></xsl:when><xsl:otherwise><xsl:value-of select="."/></xsl:otherwise></xsl:choose></xsl:attribute>
  </xsl:template>
  <xsl:template match="@*" mode="NonValues">
    <xsl:copy>
      <xsl:value-of select="(.)*2"/>pp
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Bu stil sayfası ile orijinal XML dönüştürmek Eğer, hesaplanan sonuçlar ile yeni bir XML alacak. Biraz karmaşık ama temelde kod tüm elemanları ve alt öğeleri işliyor. Her eleman için, bu dönüştürülmüş ve diğer değerler gereken değerleri özelliklerini böler. Bu kopyalar değer nitelikleri dışında her unsuru, her çocuk eleman ve her özniteliği. Değer nitelikleri işlenmiş ve başka bir değer verilir. (Bunu tutmak istiyorsanız Ama aynı zamanda sadece, özgün değer ekleyebilirsiniz.)