çok boyutlu dizilerde bul değiştir yapmak

0
Onaylı Üye
Üye
Katılım
12 Haziran 2006
Mesajlar
1,511
Tepki puanı
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 ?
 
0
Onaylı Üye
Üye
Katılım
5 Haziran 2006
Mesajlar
1,894
Tepki puanı
7
biraz daha genis bir ornek verirsen yapmak istedigini anlayabilirim su an hicbirsey anlamadım.
 
0
Onaylı Üye
Üye
Katılım
23 Aralık 2005
Mesajlar
354
Tepki puanı
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);

?>
 
0
Onaylı Üye
Üye
Katılım
12 Aralık 2004
Mesajlar
9,603
Tepki puanı
106
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.
 
0
Onaylı Üye
Üye
Katılım
23 Aralık 2005
Mesajlar
354
Tepki puanı
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);

?>
 
0
Onaylı Üye
Üye
Katılım
12 Aralık 2004
Mesajlar
9,603
Tepki puanı
106
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];
}
?>
 
0
Onaylı Üye
Üye
Katılım
12 Haziran 2006
Mesajlar
1,511
Tepki puanı
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
 
0
Onaylı Üye
Üye
Katılım
23 Aralık 2005
Mesajlar
354
Tepki puanı
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.
 
0
Onaylı Üye
Üye
Katılım
12 Haziran 2006
Mesajlar
1,511
Tepki puanı
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 :)
 
0
Onaylı Üye
Üye
Katılım
12 Aralık 2004
Mesajlar
9,603
Tepki puanı
106
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.
 
0
Onaylı Üye
Üye
Katılım
18 Ekim 2003
Mesajlar
549
Tepki puanı
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
 
0
Onaylı Üye
Üye
Katılım
12 Haziran 2006
Mesajlar
1,511
Tepki puanı
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 :(
 
Geri
Üst