Kaynakça yazımı isimler
Merhaba,
yazılar tablomda yazarların adları:
Yazı Adı | Yazarlar |
---|---|
Yazı 1 | Ali 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?
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (6)
$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
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
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.
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;
}
@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.