İyinet'e Hoşgeldiniz!

Türkiye'nin En Eski Webmaster Forum'una Hemen Kayıt Olun!

Kayıt Ol!

çok boyutlu dizilerde bul değiştir yapmak

webyazilim

0
İyinet Üyesi
Katılım
12 Haziran 2006
Mesajlar
1,511
Reaction score
0
Konum
Kayseri
Merhaba
Çok boyutlu ve boyutlarıda her eleman için farklı bir dizim var. Bu dizi içinde türkçe karakterlerin sorununu gidermek istiyorum. Türkçeleştirmeyi str_replace ile hallettim ama dizinin bütün elemanlarına nasıl uygulayabilirim ?
 

Caesar

0
İyinet Üyesi
Katılım
5 Haziran 2006
Mesajlar
1,894
Reaction score
7
biraz daha genis bir ornek verirsen yapmak istedigini anlayabilirim su an hicbirsey anlamadım.
 

metadige

0
İyinet Üyesi
Katılım
23 Aralık 2005
Mesajlar
354
Reaction score
4
PHP:
<?php
function dizi_duzelt($dizi){
  $eski = array('ü','ı','ğ','ş','ç','ö','Ü','İ','Ğ','Ş','Ç','Ö');
  $yeni = array('u','i','g','s','c','o','U','I','G','S','C','O');

  $m =count($dizi);
  for($i=0; $i<$m; $i++){
   $dizi[$i] = str_replace( $eski,$yeni, $dizi[$i]);
  }	
  return $dizi;	
}


$duzeltilecek=array('şeker','kuğu','küçük');
$duzeltilecek =dizi_duzelt($duzeltilecek);
print_r($duzeltilecek);

?>
 

Angelo

0
İyinet Üyesi
Katılım
13 Aralık 2004
Mesajlar
9,603
Reaction score
111
Konum
AZ
str_replace ile deneyip sonuç alamadıysan olmuyordur. Deneysel birşey olduğu için bilmiyorum, çok boyutlu dizilerde mantıken olmaması şaşırtıcı olmaz zaten, str_replace toplu olarak iki array'in elemanlarını karşılıklı replace eder, alt boyutları bulamaz gibi.

Artık boyut sayısına göre ana diziyi/dizileri foreach'e alıp alt elemanları str_replace yaparsın.

metadige senin örneğindeki dizi tek boyutlu ve sadece numaralandırılmış anahtarlarda işe yarar.
 

metadige

0
İyinet Üyesi
Katılım
23 Aralık 2005
Mesajlar
354
Reaction score
4
str_replace ile deneyip sonuç alamadıysan olmuyordur. Deneysel birşey olduğu için bilmiyorum, çok boyutlu dizilerde mantıken olmaması şaşırtıcı olmaz zaten, str_replace toplu olarak iki array'in elemanlarını karşılıklı replace eder, alt boyutları bulamaz gibi.

Artık boyut sayısına göre ana diziyi/dizileri foreach'e alıp alt elemanları str_replace yaparsın.

metadige senin örneğindeki dizi tek boyutlu ve sadece numaralandırılmış anahtarlarda işe yarar.

neden numaralandırılmış dizide işe yarasın ki sadece, misal benim yukarda verdiğim örnekde , dizi numaralı mı?

Veya şu şekilde dene istersen:

PHP:
<?php
$duzeltilecek=array(0 =>array('şeker','fıstık','örümcek'),1=>'kuğu',2=>'küçük');

$duzeltilecek =dizi_duzelt($duzeltilecek);
print_r($duzeltilecek);

?>
 

Angelo

0
İyinet Üyesi
Katılım
13 Aralık 2004
Mesajlar
9,603
Reaction score
111
Konum
AZ
Numaralı çünkü index atanmamış, otomatik olarak index atıyor. Örneğin aşağıdaki kod ekrana hiçbirşey basmayacaktır çünkü indexler numaralandırılmış değil.

PHP:
<?PHP

$arr['renk'] = "mavi";
$arr['koku'] = "keskin";
$arr['durum'] = "yumusak";

$m = count($arr);

for ($i=0; $i<=$m; $i++) {
echo $arr[$i];
}
?>
 

webyazilim

0
İyinet Üyesi
Katılım
12 Haziran 2006
Mesajlar
1,511
Reaction score
0
Konum
Kayseri
@Angelo
Dediklerin çok doğru. Beni anladığın için teşekkürler. Rekursif bir fonksiyon falan kullanıp tüm diziyi en derin indisine kadar taramam gerekiyor. Bir türlü çıkmadım işin içinden. Bende türk usulü yapıp tüm diziyi tek boyutlu yaptım ve her öğeye derinlik için bir değer verdim. Sonra istediğim metin öğesini türkçeleştirdim. Bir şekilde halloldu ama usta bir programcı gibi olmadı malesef.

Yeni zor sorularım var daha
 

metadige

0
İyinet Üyesi
Katılım
23 Aralık 2005
Mesajlar
354
Reaction score
4
Angelo ne demek istediğinişimdi anladım. Arkadaşım çok boyutlu dizi derken ne kadar mesela. Eğer key kullanıyorsan şöyle yapabiliriz.
PHP:
<?php
function dizi_duzelt($dizi){
  $eski = array('ü','ı','ğ','ş','ç','ö','Ü','İ','Ğ','Ş','Ç','Ö');
  $yeni = array('u','i','g','s','c','o','U','I','G','S','C','O');
  $dizi2=array_values($dizi);
  $dizi3=array_keys($dizi);
  $m =count($dizi2);
  for($i=0; $i<$m; $i++){
   $dizi2[$i] = str_replace( $eski,$yeni, $dizi2[$i]);
   $dizi[$dizi3[$i]]=$dizi2[$i];
  }	
  
  return $dizi;	
}

$arr['renk'] = "yeşil"; 
$arr['koku'] = "çürük"; 
$arr['durum'] = "yumuşak";

$arr2['yeni']['renk'] = "yeşil"; 
$arr2['eski']['koku'] = "çürük"; 
$arr2['durum'] = "yumuşak";

$arr= dizi_duzelt($arr);
print_r($arr);
echo '<br><br><br>';
$arr2= dizi_duzelt($arr2);
print_r($arr2);
?>

eğer çok değişik multidimensional array kullanıyorsan da, yukardaki örneğe göre değiştirebilirsin sanırım artık.
 

webyazilim

0
İyinet Üyesi
Katılım
12 Haziran 2006
Mesajlar
1,511
Reaction score
0
Konum
Kayseri
hocam eline sağlık, ama bu dediğim şekilde tam bir tarama yapmıyor.

Asıl uğraştığım şey çok karışık aslında. Bu boyut olayını hallettim. Yapmaya çalıştığım windows içindeki klasörler sisteminin mysql içindeki hali. Sonsuz klasör iç içe oluşturulsa bile sorun yaşamamam lazım. Veya onlarca iç içe kategori vs. Bu boyutuda başardım aslında. Dediğim rekürsif yani kendi içine dönen fonksiyonlarla yapabiliyorum. DB tablo yapısına bağımlı olsada örnek vereyim;

PHP:
   function altvarmi($ida) {
      $catalt = mysql_query("select * from categories where output='$ida'");
      $toplam = mysql_num_rows($catalt);
      if ($toplam) return true;
      else         return false;
    }
    
    function remcatfonk($idm) {
      global $altvarr;
      global $i;
      global $topl;

      if (altvarmi($idm)) {
          $cattopla=mysql_query("select * from categories where output='$idm'");
          while ($c=mysql_fetch_assoc($cattopla)): 
             $topl[]=$c[id]." ";
             remcatfonk($c[id]);
          endwhile;
      }
      else {
          return false;
      }
      return $topl;
    }

Bu ikisi mesela veritabanında sonsuz alt alt oluşturulmuş klasörleri silmek için kullandıklarım. Her seferinde bir önceki klasör bilgisinden aldıkları ID ve OUTPUT bilgileri ile diğerini siliyorlar ve döngüler gibi davranıyorlar.

Normalde bana göre çok daha ileride olan abilerimiz class yapısında bu işi yapıp silmek ya da taşımak vs.. için parça parça fonksiyonlarla uğraşmıyorlar. Tabi o beni aşar :)

Ama daha karmaşık bir sorunumda var. Bakalım onu nasıl çözücem :)
 

Angelo

0
İyinet Üyesi
Katılım
13 Aralık 2004
Mesajlar
9,603
Reaction score
111
Konum
AZ
Ben bir dosya sistemini sonsuz hiyerarşide kataloglamak için benzer bir mantık kurmuştum. Kategori-alt kategori match şekli, boyut bilinmediği için zor olduğu için her bir seviye ID'si için successor (halefi) diye bir alan açıp böylece, 4, 1'in altında, 27 4'ün altında, 48 27'nin altında gibi gider şekilde yapmıştım, silmek için de benzer recursive fonksiyon kullanılabilir.
 

zahmaci

0
İyinet Üyesi
Katılım
19 Ekim 2003
Mesajlar
549
Reaction score
0
Konum
Antalya
PHP:
function kategoriler($komsu,$duzey,$tabloadi){
        $q = mysql_query("SELECT kid, adi, komsu FROM $tabloadi WHERE kid<>0 and komsu=$komsu order by adi") or die ("hata");
        $a = array();
        while ($row = mysql_fetch_array($q)){
            $row[3] = $duzey;
            $a[] = $row;
            $b = kategoriler($row[0], $duzey+1, $tabloadi);
            for ($j=0; $j < count($b); $j++){ $a[] = $b[$j];}
        }
        return $a;
}
Kod:
CREATE TABLE `sayfa_kategori_z` (
  `kat_id` int(11) NOT lisanssız auto_increment,
  `kat_ust` varchar(11) NOT lisanssız default '',
  `kat_ismi` varchar(255) NOT lisanssız default '',
  `baslik` text NOT lisanssız,
  `aciklama` text NOT lisanssız,
  `anahtarkelimeler` text NOT lisanssız,
  PRIMARY KEY  (`kat_id`)
) TYPE=MyISAM AUTO_INCREMENT=13 ;

#
# Tablo döküm verisi `sayfa_kategori_z`
#

INSERT INTO `sayfa_kategori_z` VALUES (1, '', 'Test', 'Test title', 'test aciklama', 'test anahtar');
INSERT INTO `sayfa_kategori_z` VALUES (2, '', 'Test 2', 'Test 2 title', 'Test 2 desc', 'Test 2 keywords');
INSERT INTO `sayfa_kategori_z` VALUES (3, '2', 'Test2 sub', 'Test2 sub title', 'Test2 sub desc', 'Test2 sub keywords');
INSERT INTO `sayfa_kategori_z` VALUES (4, '1', 'Test 1 sub', 'Test 1 sub title', 'Test 1 sub desc', 'Test 1 sub keyword');
INSERT INTO `sayfa_kategori_z` VALUES (10, '', 'Test 3', 'wwre323', 'wsers2323232erdfgdgfg dgf dfg dg d', 'd2323fgg dgf dg dfg d');
INSERT INTO `sayfa_kategori_z` VALUES (11, '4', 'Test 1 sub sub1', 'Test 1 sub sub1 title', 'Test 1 sub sub1 desc', 'Test 1 sub sub1 keywords');
INSERT INTO `sayfa_kategori_z` VALUES (12, '1', 'Test sub 2', 'Test sub 2 title', 'Test sub 2 desc', 'Test sub 2 keywords');

kullanım örneği:
PHP:
<select name="kategori">
<option value="0">Ana kategori</option>
<?php
	$tmp = isset($_GET["kid"]) ? $_GET["kid"] : $_POST["kid"];
	$kategoriler = kategoriler(0,0,$kategori_tablosu);
	for ($i=0; $i<count($kategoriler); $i++)
	{
		echo "<option value=\"".$kategoriler[$i][0]."\"";
		if ($tmp == $kategoriler[$i][0]) //kategori seçimi
			echo " selected";
		echo ">";
		for ($j=0;$j<$kategoriler[$i][3];$j++) echo "  > ";
		echo $kategoriler[$i][1];
		echo "</option>";
	}
?>
</select>


Bilmem işinize yarar mı ama (mesajları okudum yeni uyandım doğru anlamamış olabilirim)

yukarıdaki fonksiyon sanırım işinize yarayabilir.. Sonsuz alt kategori yapan bir fonksiyon...

anlayamadığınız yerler olursa açıklama yaparım elbette...

Saygılar
 

webyazilim

0
İyinet Üyesi
Katılım
12 Haziran 2006
Mesajlar
1,511
Reaction score
0
Konum
Kayseri
@Angelo dediğinin aynısı benim yaptığımda zaten. Bilgiler için tekrar teşekkürler. İnşallah ilerde benim sitenin forumlarında da görürüm seni :)

@zahmaci çok saol, aynını yaptım ama durumlar daha karışık şuanda. onunda içinden çıkmaya çalışıyorum. Klasorleri biliyorsunuz windowsta üst üste yapıştırınca aynı isimli klasör içerikleri toplanıyor. Yani elma klasörünü elma klasörüne yapıştırınca eğer yapıştırdığınız içinde armut, üstüne yapıştırılan içinde çilek varsa işlem bittiğinde klasörde armut ve çilek klasörleride oluyor. İşte yapmaya çalıştığım bu ve bunlardan biraz daha karışık çıktı günlerdir uğraşıyorum :(
 

Türkiye’nin ilk webmaster forum sitesi iyinet.com'da forum üyeleri tarafından yapılan tüm paylaşımlardan; Türk Ceza Kanunu’nun 20. Maddesinin, 5651 Sayılı Kanununun 4. maddesinin 2. fıkrasına göre, paylaşım yapan üyeler sorumludur.

Backlink ve Tanıtım Yazısı için iletişime geçmek için Skype Adresimiz: .cid.1580508955483fe5

Üst