Temat: Generowane warunki IF na podstawie zawartości tablicy w...

Witam serdecznie!
Mam takie pytanie. Magluję to już cały wieczór a nie wiem czy da się coś takiego zrobić hehe

Aktalnie mam coś takiego:

[php]
$expStringN = explode(';', $newspapersString); // POBIERAMY STRINGA I ROZBIJAMY GO NA TABLICE POPRZEZ ZNAK ŚREDNIKA

$strN = '';

$expStringNFilter = array_filter($expStringN,array($this, "notNull"));

foreach ($expStringNFilter as $strKey => $strValue)
{
if ($strValue == 0) {$newspaperName = "A<br/>";};
if ($strValue == 1) {$newspaperName = "B<br/>";};
if ($strValue == 2) {$newspaperName = "C<br/>";};
if ($strValue == 3) {$newspaperName = "D<br/>";};
if ($strValue == 4) {$newspaperName = "E<br/>";};
if ($strValue == 5) {$newspaperName = "F<br/>";};
$strN .= $newspaperName;
};

return $strN;
[/php]

Ten kod mi działa... jednak moje pytanie brzmi czy mogę te IF'y wygenerować na podstawie zawartości tablicy np. GAZETY? W zależności od tego ile jest tytułów gazet w tablicy to tyle i takie robi warubki IF.
Żeby było jasne jedna instrukcja warunkowa to jeden rekord. W kodzie powyżej wpisałem sobie ręcznie, ale fajnie byłoby gdyby w razie dodania kolejnego tytułu gazety nietrzebabyłoby ręcznie poprawiać kodu tylko automatycznie by się to generowało na podstawie bazy danych.

Pozdrawiam
Łukasz Z.

Łukasz Z. Specjalista ds
Informatyki w Mentor
S.A.

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

Jeśli jesteś w stanie określić jaką formę mają te tytuły to użyj wyrażeń regularnych przy pomocy np. funkcji http://www.php.net/manual/pl/function.preg-match-all.php
W wyniku dostaniesz tablicę ze znalezionymi np. tytułami, które możesz sobie w pętli obrobić.

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

hmmmm w preg_match muszę podać "patern"... a co jeśli zmieni się jakiś tytuł? nie chciałbym ograniczać się do jakiś szablonów jeśli mam w tablicy przypisane ID do TYTUŁÓW.

na początku kombinowałem tak...

[php]
$expStringN = explode(';', $newspapersString); // POBIERAMY STRINGA I ROZBIJAMY GO NA TABLICE POPRZEZ ZNAK ŚREDNIKA

$strN = '';

$expStringNFilter = array_filter($expStringN,array($this, "notNull"));

foreach ($expStringNFilter as $strKey => $strValue)
{
WHILE (arrayTytuły)
{
if ($strValue == arraytytuly[id]) {$newspaperName = arraytytuly[tytul];};
}
$strN .= $newspaperName;
};

return $strN;
[/php]

ale chyba to trochę zbyt proste by było ;)
Łukasz Z.

Łukasz Z. Specjalista ds
Informatyki w Mentor
S.A.

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

Jeśli chcesz mieć literki od A do ileś tam zgodnie z indeksem to może bezczelnie zasugeruję funkcję http://www.php.net/manual/pl/function.chr.php ;)

Dzięki temu linie
if ($strValue == 0) {$newspaperName = "A<br/>";};
if ($strValue == 1) {$newspaperName = "B<br/>";};
if ($strValue == 2) {$newspaperName = "C<br/>";};
if ($strValue == 3) {$newspaperName = "D<br/>";};
if ($strValue == 4) {$newspaperName = "E<br/>";};
if ($strValue == 5) {$newspaperName = "F<br/>";};
$strN .= $newspaperName;
Zmienią się w
$strN .= chr(65 + $strValue) . "<br/>";
Szatańskie to, ale może... ;)
Oczywiście zabawa skończy się kiedy natrafisz na Z i będziesz chciał iść dalej ;)

Alternatywą jest dodatkowa tablica z tytułami - skrypt skądś musi w końcu wiedzieć, że 0 to A, 1 to B, itd. Dzięki tablicy zamiast A, B, C, itd. będziesz mógł zawsze wstawić coś innego. Zawsze też możesz tę dodatkową tablicę sobie przygotowywać dynamicznie na podstawie czegoś tam co będzie Ci potrzebne. Odwołanie się do takiej tablicy poprzez indeks będzie można zapisać w jednej linii podobnie jak w mojej propozycji użycia funkcji chr ;)Łukasz Z. edytował(a) ten post dnia 25.04.12 o godzinie 13:25

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

heheh na php.pl tez mi to ktoś proponował: http://forum.php.pl/Generowane_warunki_IF_na_podstawie...

ale to nie ma być tylko literka :) heehe to jest tytuł, ciąg różnych znaków. Np. Przyjaciółka, Teleekspress.
Łukasz Z.

Łukasz Z. Specjalista ds
Informatyki w Mentor
S.A.

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

Nie zdążyłem edycji wysłać - przeczytaj poprzedni mój wpis (końcówkę).

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

albo ja Ciebie nie rozumiem hehe albo Ty mnie :)

ja mam już tablicę taką:

+ ----------------- + ------------------- +
| id_newspaper | newspaper_name |
+ ----------------- + ------------------- +
| 0 | playboy |
| 1 | newsweek |
| 2 | Moja codzienna |
| 3 | Twoja prasa |
| 4 | Gazeta Super |
| 5 | Tytuł gazety |
+ ----------------- + ------------------- +


mam ją już w zmiennej.

Mamy jakiś ciąg... np. $coś = ;0;3;5;
Chciałbym zeby program sam przeiterował się po tablicy powyżej i zamienił 0 na PLAYBOY, 3 na TWOJA PRASA i 5 na TYTUŁ GAZETY.
Trzeba dodać, że te wymyślone ciągi $coś też są w tablicy i mogą być różne. Drugi np. ;3;4;5;, itp.
Muszę dodać, że wcześniej też robię iterację po tablicy w której w każdym z rekordów znajduje się taki ciąg.Waldemar Stańko edytował(a) ten post dnia 25.04.12 o godzinie 13:37
Tomasz Zadora

Tomasz Zadora programuję

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

Jaki jest Twój cel - zmiana liter z małych na duże? Wyjaśnij generalnie co chcesz osiągnąć.

PS. Co Ci się stało z okiem?

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

generalnie zamiana cyferki (z ciągu liczb) np. ;0;2;3; na tytuł gazety.
jedna cyferka odpowiada ID w tabeli gdzie są TYTUŁY GAZET.

Wynik ;0;2;3; ma wyglądać tak (z tabelki wyżej):
PLAYBOY
MOJE CODZIENNA
TWOJA PRASAWaldemar Stańko edytował(a) ten post dnia 25.04.12 o godzinie 13:52
Tomasz Zadora

Tomasz Zadora programuję

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

Jeżeli masz tablicę gdzie id jest przyporządkowane do tytułu to jest bardzo proste.

Kwestia tylko co to za tablica: tablica w bazie danych, tablica zwykła, asocjacyjna?

Jeżeli w bazie danych to tworzysz odp. zapytanie SQL, jeżeli tablica to:

echo $tablica[$id];


$expStringN = explode(';', $newspapersString);
foreach ($expStringN as &$id)
{
if (!is_numeric($id) || !isset($tablica[$id])) continue;
echo $tablica[$id].'<br />';
}


Jak chcesz duże litery to funkcja strtoupper.Tomasz Zadora edytował(a) ten post dnia 25.04.12 o godzinie 13:58
Łukasz Z.

Łukasz Z. Specjalista ds
Informatyki w Mentor
S.A.

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

Waldemar Stańko:
albo ja Ciebie nie rozumiem hehe albo Ty mnie :)

No to faktycznie się nie zrozumieliśmy.
Waldemar Stańko:
ja mam już tablicę taką:

+ ----------------- + ------------------- +
| id_newspaper | newspaper_name |
+ ----------------- + ------------------- +
| 0 | playboy |
| 1 | newsweek |
| 2 | Moja codzienna |
| 3 | Twoja prasa |
| 4 | Gazeta Super |
| 5 | Tytuł gazety |
+ ----------------- + ------------------- +


mam ją już w zmiennej.

Mamy jakiś ciąg... np. $coś = ;0;3;5;
Chciałbym zeby program sam przeiterował się po tablicy powyżej i zamienił 0 na PLAYBOY, 3 na TWOJA PRASA i 5 na TYTUŁ GAZETY.

Czy chodzi Tobie zatem o coś takiego jak niżej?

foreach ($id_newspaper as $key=>$val)
$id_newspaper [$key] = newspaper_name [$val];
Łukasz Z. edytował(a) ten post dnia 25.04.12 o godzinie 14:39

Temat: Generowane warunki IF na podstawie zawartości tablicy w...


foreach ($expStringNFilter as $strKey => $strValue)
{
if (!is_numeric($strKey) || !isset($expStringNFilter[$strKey])) continue;
$strN .= $expStringNFilter[$strKey].'<br />';
};
return $strN;


Zrobiłem jak powyżej... :]
Rezultat jest taki że pokazuje mi tak jak chciałem tylko same cyfry.

Miało być tak:
Wynik ;0;2;3; ma wyglądać tak:
PLAYBOY
MOJE CODZIENNA
TWOJA PRASA

a pokazuje tak:
0
2
3

Ogólnie mój główny problem pozostał. Jak to zamienić na tytuł... tak długo już z tym walczę, że już mam sieczkę z mózgu.

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

1. Utwórz sobie tablicę z kluczami i odpowiednio do nich przypisanymi tytułami (albo statycznie albo dynamicznie odczytując tytuły z bazy danych), nazwijmy ją $aTabName.

2. Rozbij swój ciąg na tablicę (czyli, explode o którym pisałeś w pierwszym poście)

I teraz mała pętla:


$sTxt="";
foreach ($expStringNFilter AS $val) $sTxt.=$aTabName[$val].", ";


w $sTxt masz nazwy czasopism oddzielone przecinkami.Andrzej K. edytował(a) ten post dnia 25.04.12 o godzinie 15:41

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

nom a jesli mam zapytanie do bazy danych to nie powinno być jeszcze w jednym "foreach" który obsługiwałby tablice KLUCZ i TYTUŁ ?

Teraz mam "Undefined index" wraz z dziwnym wynikiem:
0, ,

konto usunięte

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

Waldemar Stańko:
nom a jesli mam zapytanie do bazy danych to nie powinno być jeszcze w jednym "foreach" który obsługiwałby tablice KLUCZ i TYTUŁ ?

Teraz mam "Undefined index" wraz z dziwnym wynikiem:
0, ,

1) Masz banalny problem do rozwiązania (bez urazy)

2) Od początku unikasz podawania całego kodu procesu

3) Przez co wszyscy błądzimy

4) I generalnie temat mógłby się skończyć na pierwszej odpowiedzi - gdybyś podał:
a) dane wejściowe (przykład w 4 wypowiedzi)
b) źle działający pełny kod (nie podałeś SQLa)
c) oczekiwany wynik (to już za którymś razem podałeś)

http://rtfm.killfile.pl/Piotr L. edytował(a) ten post dnia 25.04.12 o godzinie 16:21

konto usunięte

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

Osobiscie rozwiazalbym to w nastepujacy sposob:

<?php

// do $titles zaladowalbym zawartosc tabeli z tytulami gazet, powstanie ponizsza tablica
$titles = array(
0 => 'playboy',
1 => 'newsweek',
2 => 'Moja codzienna',
3 => 'Twoja prasa',
4 => 'Gazeta Super',
5 => 'Tytuł gazety'
);

// przelecialbym sie petelka po rozdzielonych srednikiem ID tytulow z Twojego stringa $newspapersString
$output = '';
foreach (explode(';', $newspapersString) AS $item) {
// po sprawdzeniu, ze ID tytulu istnieje, odczytalbym nazwe i dodal do wyjsciowego stringa $output
if (isset($titles[$item])) $output .= $titles[$item].'<br>';
}

echo $output;
?>


Edit: poprawa literowek, wino zrobilo swoje ;)Arek Pietrzyk edytował(a) ten post dnia 26.04.12 o godzinie 09:29

konto usunięte

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

Coś takiego bym proponował jak przedmówca, tylko, że zamiast foreach i ifów, bym użył funkcji PHP array_map, co chyba byłoby bardziej eleganckie.

$titles = array(
0 => 'playboy',
1 => 'newsweek',
2 => 'Moja codzienna',
3 => 'Twoja prasa',
4 => 'Gazeta Super',
5 => 'Tytuł gazety'
);

function mapTitles($number){
global $titles;
return $titles[$number];
}

$input = "2;1;2;1;0"; # przykladowe wejscie

$output = explode(";", $input);
$output = array_map('mapTitles',$output);
$output = implode('<br />',$output);

echo $output;


przy założeniu, że mówimy o tytułach i stringach, które są w pamięci, a nie w bazie danych, bo to inna bajka.Łukasz Lityński edytował(a) ten post dnia 26.04.12 o godzinie 00:26

konto usunięte

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

Ja nie lubie naduzywania globali, gdy nie jest to absolutnie konieczne ;)
Tomasz Zadora

Tomasz Zadora programuję

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

Łukasz Lityński:
Coś takiego bym proponował jak przedmówca, tylko, że zamiast foreach i ifów, bym użył funkcji PHP array_map, co chyba byłoby bardziej eleganckie.

Świetny sposób na przekombinowanie, w moim przykładzie "ify" to były dla bezpieczeństwa - przy założeniu, że ciąg do explode pochodzi z zewnątrz.

Temat: Generowane warunki IF na podstawie zawartości tablicy w...

Ok podstaram się przedstawić wszystko jak mówił Piotr. Zgadzam się z nim problem pewnie jest banalny hehe. Tyle przy tym siedze, że nie widzę już tego. Nigdy nie chciałem wrzucać całego kodu bo mogłoby to przerazić do czytania ;) wolałem wytłumaczyć.


/* *** ZAPYTANIE SQL - WYCIĄGA WSZYSTKIE ZLECENIA - TO JEST OK! *** */
public function selectOrdersByOffice($office)
{
$this->connectDB();
$dbResult = @mysql_query(" SELECT oc.id_order, DATE_FORMAT(oc.date, '%d-%m-%Y') AS date, DATE_FORMAT(oc.date, '%H:%i') AS time, u.name, u.surname, c.firm_name, m.module_name, oc.edition_number, oc.newspapers FROM orders_current AS oc INNER JOIN users AS u ON oc.users_id_user = u.id_user INNER JOIN clients AS c ON oc.clients_id_client = c.id_client AND u.offices_id_office = ".$office." INNER JOIN modules AS m ON oc.modules_id_module = m.id_module; ") or die('Błąd zapytania - select eventu zlecenia.');
return($dbResult);
$this->releaseDB();
}



/* *** ZAPYTANIE SQL - Z TABLICY KLUCZ I WARTOŚĆ [ID + TYTUŁ] - TO JEST OK! *** */
public function selectAllNewspapers()
{
$this->connectDB();
$dbResult = @mysql_query("SELECT id_newspaper, newspaper_name FROM newspapers") or die('Błąd zapytania - select wszystkich gazet.');
return($dbResult);
$this->releaseDB();
}



/* *** FORMULARZ GENERUJE W TABELI LISTĘ WSZYSTKICH ZLECEŃ *** */
<form class="" action="" method="POST" name="zleceniaPrzegladajForm">
<?php echo "<div style=\"position: absolute; top: 5px; left: 220px;\">".$btnUsunZlecenie."</div>";?>
<?php $office = $_SESSION['offices_id_office'];
$ordersByOffice = $dbh->selectOrdersByOffice($office);
$num_rows = mysql_num_rows($ordersByOffice);
$selectAllNewspapers = $dbh->selectAllNewspapers();
$selectAllNewspapersArray = mysql_fetch_array($selectAllNewspapers);
if ($num_rows > 0) // jeśli coś znalazło
{ ?>
<table width="100%" border="0" cellspacing="0" cellpadding="0" class="classicTable">
<thead>
<tr>
<th width="20"></th>
<th>NAZWA FIRMY</th>
<th>MODUŁ</th>
<th>NUMERY GAZET</th>
<th>GAZETY</th>
<th>ZLECENIOBIORCA</th>
<th>DATA WPROWADZENIA</th>
</tr>
</thead>
<tbody>
<?php
while ($ordersByOfficeArray = mysql_fetch_array($ordersByOffice))
{
echo "<tr><th><input name=\"id_order\" type=\"radio\" class=\"\" value=\"".$ordersByOfficeArray['id_order']."\"></th>
<td>".$ordersByOfficeArray['firm_name']."</td>
<td>".$ordersByOfficeArray['module_name']."</td>
<td>".$ordersByOfficeArray['edition_number']."</td>
/* LINIA PONIŻEJ - ZROBIŁEM KLASĘ W KTÓRY WRZUCAM np. (;0;1;2;3;4; , TABLICA Z WSZYSTKIMI [ID + TYTUŁY]) MYŚLĘ, ŻE TU JEST BŁĄD... */
<td>".$decodeNewspaper->decodeN($ordersByOfficeArray['newspapers'],$selectAllNewspapersArray)."</td>
<td>".$ordersByOfficeArray['name']." ".$ordersByOfficeArray['surname']."</td>
<td>".$ordersByOfficeArray['date']."</td>
</tr>";
};
?>
</tbody>
</table>
</form>



/* *** KLASA decodeNewspaper - TUTAJ UZYSKUJE WYNIK WIZUALNY TAKI JAKI CHCĘ :) TYLKO ŻE TE WARUNKI IF SĄ Z RĘKI WPISANE. CHCIAŁEM ŻEBY BYŁY GENEROWANY NA PODSTAWIE TABLICY [ID + TYTUŁY] *** */
class decodeNewspaper
{
private function notNull($var) { return($var != null);} // NIE RUSZAĆ
public function decodeN($newspapersString,$selectAllNewspapersArray)
{
$expStringN = explode(';', $newspapersString);
$strN = '';
$expStringNFilter = array_filter($expStringN,array($this, "notNull"));
foreach ($expStringNFilter as $strKey => $strValue)
{
/* **** START - MOJE WCZEŚNIEJSZA PROPOZYCJA - tylko że tutaj wpisałem z palca te warunki.**** */
if ($strValue == 0) {$newspaperName = "Życie Rawicza<br/>";};
if ($strValue == 1) {$newspaperName = "Życie Gostynia<br/>";};
if ($strValue == 2) {$newspaperName = "Gazeta Jarocińska<br/>";};
if ($strValue == 3) {$newspaperName = "Życie Pleszewa<br/>";};
if ($strValue == 4) {$newspaperName = "Gazeta Krotoszyńska<br/>";};
if ($strValue == 5) {$newspaperName = "Wieści Rolnicze<br/>";};
$strN .= $newspaperName;
/* **** KONIEC - MOJE WCZEŚNIEJSZA PROPOZYCJA **** */
};

return $strN;
}
};


I teraz PROBLEM:
Z Ciągu znaków $ordersByOfficeArray['newspapers']
który dla każdego zlecenia wygląda np. tak: ;0;2;3;4;
zrobiło na podtsawie tablicy z zapytania $selectAllNewspapersArray
którego wynik wygląda tak:

+ ----------------- + ------------------- +
| id_newspaper | newspaper_name |
+ ----------------- + ------------------- +
| 0 | Życie Rawicza |
| 1 | Życie Gostynia |
| 2 | Gazeta Jarocińska |
| 3 | Życie Pleszewa |
| 4 | Gazeta Krotoszyńska |
| 5 | Wieści Rolnicze |
+ ----------------- + ------------------- +

Wynik ma wyglądać tak:

Żyie Rawicza
Gazeta Jarocińska
Życie Pleszewa
Gazeta Krotoszyńska


Trochę tego jest ... ;/

P.S
Tak ma wyglądać:
http://imageshack.us/photo/my-images/27/taktb.jpg


Tak wygląda aktualnie:
http://imageshack.us/photo/my-images/577/niei.jpg
Waldemar Stańko edytował(a) ten post dnia 26.04.12 o godzinie 09:33

Następna dyskusja:

Divy z przyciskami generow...




Wyślij zaproszenie do