v2.5.2
Giriş yap

Kaynakça yazımı isimler

rephp7
559 defa görüntülendi

Merhaba,
yazılar tablomda yazarların adları:

Yazı AdıYazarlar
Yazı 1Ali Beyaz, Veli Kırmızı, Ahmet Turuncu

Tablodaki isimler arasındaki virgül sonrası boşluk yazılmış olabiliyor.

Kaynakça gösterimi için:
1.Durum: Tek yazarlıysa: Beyaz, Ali
2.Durum: İki yazarlıysa: Beyaz, Ali ve Veli Kırmızı
3.Durum: Üç yazarlıysa: Beyaz, Ali, Veli Kırmızı ve Ahmet Turuncu

şeklinde almam lazım. Bu 3 durum için ayrı ayrı bu isimleri nasıl dönderebilirim?

Cevap yaz
Cevaplar (6)
makifgokce
1157 gün önce
$authors = [
	"Ali Beyaz",
	"Veli Kırmızı",
	"Ahmet Turuncu",
	"Hasan Hüseyin Siyah"
];
foreach($authors as $key => $author){
	$x = explode(' ', $author);
	$r = '';
	if ($key == 0) {
		foreach($x as $k => $s){
			if($k == 0) {
				$r .= end($x).', '.$s;
			} else if ($k == count($x) - 1) {
				continue;
			} else {
				$r .= ', '.$s;
			}
		}
	} else {
		foreach($x as $k => $s){
			if ($k == count($x) - 1) {
				$r .= ', '.$s;
			} else if($k == 0) {
				$r .= $s;
			} else {
				$r .= ', '.$s;
			}
		}
	}
	$authors[$key] = $r;
}
$q = '';
foreach($authors as $d => $v){
	if($d == 0){
		$q .= $v;
	} else if (end($authors) != $v) {
		$q .= ' | '. $v;
	} else {
		$q .= ' ve '.$v;
	}
}
echo $q;
// Output: Beyaz, Ali | Veli, Kırmızı | Ahmet, Turuncu ve Hasan, Hüseyin, Siyah
rephp7
1157 gün önce

Evet insanların iki soyad kullandığını atlamışım. Emeğiniz ve ayırdığınız zaman için teşekkür ederim.

makifgokce
1157 gün önce

bu dediğiniz tüm kodların değişmesi demek :) çünkü isimleri ayırmak için explode() ile boşluktan bölerek yaptım.
Yazar isimleri ad soyad ayrı alma imkanın varsa bunu yapmak çok daha kolay olur.

$authors = [
	["ad" => "Ayşe Fatma", "soyad" => "KARA ÇETİN"],
	["ad" => "Ali ", "soyad" => "Beyaz"],
	["ad" => "Veli ", "soyad" => "Kırmızı"],
	["ad" => "Ahmet ", "soyad" => "Turuncu"],
	["ad" => "Hasan Hüseyin ", "soyad" => "Siyah"]
];
$x = '';
foreach($authors as $key => $author){
	if ($key == 0) {
		$x .= $author["soyad"]. ', ' .$author["ad"];
	} else if($key == (count($authors) - 1)) {
		$x .= ' ve '.$author["ad"]. ', ' .$author["soyad"];
	}else {
		$x .= ', '.$author["ad"]. ', ' .$author["soyad"];
	}
}
echo $x;
// Output: KARA ÇETİN, Ayşe Fatma, Ali , Beyaz, Veli , Kırmızı, Ahmet , Turuncu ve Hasan Hüseyin , Siyah
rephp7
1157 gün önce

dediğinize ek olarak biraz daha kurcaladım ve

if ($k == count($x) - 1)

yerine

if ($k == $x[count($x) - 1])

yazdım. Bu haliyle istediğim gibi oldu yalnız şu detayı atlamışım.
Sadece ilk yazar için kişinin iki soyadı varsa ve bu soyadlar dizi içinde BÜYÜK HARFLE yazılmış burdan bunun soyad olduğunu nasıl algılatabilirim?
Örnek: Ayşe Fatma KARA ÇETİN
Bu haliyle şöyle yazıyor: ÇETİN, Ayşe Fatma KARA
Doğrusu: ÇETİN KARA, Ayşe Fatma

Çok zorluyorum ama doğru sonuç almam çok önemli.
Sanırım tablolamamı değiştirmem ek olarak ad ve soyad sütunlu başka bir tablo tutmam lazım. Bu şekilde algılatmam çok zor sanırım.

@makifgokce, emeğiniz için teşekkür ederim bundan sonrasını yapı olarak çözemeye çalışacağım. İlk kod bloğunuzu çözüm olarak işaretliyorum.
İhtiyacı olan sonraki yorumlardan düzeltmeleri dikkate alsın.

makifgokce
1157 gün önce

foreach içindeki else kısımlarının ikisinide bu şekilde değiştirirsen sanırım istediğin gibi olur.

} else {
	$r .= ' '.$s;
}
rephp7
1157 gün önce

@makifgokce hocam, teşekkürler. Şu kısmı ayarlayamadım verdiğiniz kodda son kişinin adını virgül ile ayrıyor. Hasan, Hüseyin, Siyah (Kişinin adının üç veya daha fazla kelimeli olması sorun yaratıyor)

Tek yazarlıysa Birinci kişinin Soyadı (virgül) Adı olacak Örnek: Ali Beyaz --> Beyaz, Ali
İkinci yazar varsa Örnek: Beyaz, Ali (ve) Veli Kırmızı
Üç yazarlıysa Örnek: Beyaz, Ali (virgül) Veli Kırmızı (ve) Ahmet Turuncu

Sadece İlk isim ters çevrilip virgül ile ayrılacak sonraki yazarlar ismi bozulmadan virgül ile ayrılacak ve son yazardan önce "ve" gelecek.

Uğraştım ama iyi karıştırdım kodunuzu değiştiremedim.