PHP nasıl ilk büyük maçı işlem?

2 Cevap php

Tamam, bu yüzden ilk çevresinde arama denedim ama tam olarak nasıl bir kelime bu soru ya da bir arama ifade bilmiyordum. Anlatayım.

Şöyle ki veri var:

<!-- data:start -->
    <!-- 0:start -->
        <!-- 0:start -->0,9<!-- 0:stop -->
        <!-- 1:start -->0,0<!-- 1:stop -->
        <!-- 2:start -->9,0<!-- 2:stop -->
        <!-- 3:start -->9,9<!-- 3:stop -->
        <!-- 4:start -->0,9<!-- 4:stop -->
    <!-- 0:stop -->
    <!-- 1:start -->
        <!-- 0:start -->1,5<!-- 0:stop -->
        <!-- 1:start -->1,6<!-- 1:stop -->
        <!-- 2:start -->3,6<!-- 2:stop -->
        <!-- 3:start -->3,8<!-- 3:stop -->
        <!-- 4:start -->4,8<!-- 4:stop -->
    <!-- 1:stop -->
    <!-- 2:start -->
        <!-- 0:start -->0,7<!-- 0:stop -->
        <!-- 1:start -->1,7<!-- 1:stop -->
    <!-- 2:stop -->
<!-- data:stop -->

Yani temelde noktaları bir grup bulunuyor. İşte ben şu anda öyle gibi bir dizi yaratacak böylece denemek ve ayrıştırmak için kullanıyorum kodu:

Array (
    0 => Array (
        0 => "0,9",
        1 => "0,0",
        2 => "9,0",
        3 => "9,9",
        4 => "0,9"
    ),
    1 => Array (
        0 => "1,5",
        1 => "1,6",
        2 => "3,6",
        3 => "3,8",
        4 => "4,8"
    ),
    2 => Array (
        0 => "0,7",
        1 => "1,7"
    )
)

Ancak, bu gibi görünen bir dizi geri dönüyor:

Array (
    0 => "0,9",
    1 => "0,0",
    2 => "9,0"
)

Benim ekranda olması büyük dizi görüntülerken, eşleşen zaman o değişkenin ilk örneğini ayarlıyor görüyoruz. Peki nasıl ilk geniş eşleşme bulmak için almak ve daha sonra içi işlemek yok. İşte ben şu anda kullanıyorum fonksiyonudur:

function explosion($text) {
    $number = preg_match_all("/(<!-- ([\w]+):start -->)\n?(.*?)\n?(<!-- \\2:stop -->)/s", $text, $matches, PREG_SET_ORDER);
    if ($number == 0) return $text;
    else unset($item);
    foreach ($matches as $item) if (empty($data[$item[2]])) $data[$item[2]] = $this->explosion($item[3]);
    return $data;
}

Ben aptal ve ben gözardı ettik basit bir şey olacak eminim, ama bu sadece herhalde sizin için kolay bir cevap yapar.

EDIT: İşte full output log Ben bu örnek aldı tüm veri kümesi olduğu. Etiketleri basılmış (> ve <code></code> eleman içeride edilir.

İşte karıştırıyor parçasıdır:

Array ( [0] => <!-- 0:start --> <!-- 0:start -->0,9<!-- 0:stop -->  [1] => 0 [2] => <!-- 0:start -->0,9 )

0 => <!-- 0:start -->0,9

Yani bunun içinde başka bir parça için durdurma etiketinin ilk olayda Duruyor. Ben ters yönde düşünme ve ilk küçük parça işleme, bu yüzden daha büyük parçaları kesmek ve daha sonra büyük parça işleme olmaz bu değiştirilmesi gerekir?

2 Cevap

Buyrun:

function explosion($text) {
    preg_match_all("/<!-- ([\d]+):start -->(.+?)<!-- .*:stop -->/", $text, $matches, PREG_SET_ORDER);

    $return = array();
    foreach($matches as $match) {
        if($match[1]==0) {
            $return[] = array();
        }
        $return[count($return)-1][] = $match[2];
    }   
    return $return;
}

Peki bu benim için çalışıyor:

function explosion($text) {
    $number = preg_match_all('/<(.*?)>(.+?)[<]/s', $text, $matches);
    if ($number == 0) return $text;

    $temp = array();
    $data = array();
    foreach($matches[2] as $coords){
        if(trim($coords)==""){
            if(!empty($temp)){
                $data[] = $temp;
                $temp = array();
            }
        }else{
            $temp[] = $coords;
        }
    }
    return $data;
}

Kodunuzu sorun alt etiketler ve etiketli değerleri toplayıp olmasıydı. Tabii ki tarayıcı basılmış zaman gizli, bu yüzden amacı hata ayıklama için bunun bir günlüğünü alarak denemek olacaktır.