Перейти к содержимому

Фото
- - - - -

поиск и вывод на экран - массивы ассоциативные


  • Вы не можете создать новую тему
  • Please log in to reply
13 ответов в этой теме

#1 Alex5

Alex5
  • Пользователь
  • 42 сообщений

Отправлено 16 июля 2006 - 09:18

Доброе утро. Есть проблема... есть страничка index.php там форма - туда ввожу Имя и на страничке test.php хочу получить Фамилию (конкретную введённому имени)
вот test.php:
<?
$name = file("data/names.txt");
$surname = file("data/surnames.txt");

$data_array = array(
$name[0] => $surname[0],
$name[1] => $surname[1],
$name[2] => $surname[2]);


foreach($data_array as $key =>$value)
{
if(array_key_exists($_POST['request'], $data_array))
$request = $data_array[$key];
print_r ($request);
}

?>
знаю что проблема в $request = $data_array[$key] - Но никак не решить - выведет на экран все значения массива :( а надо чтоб вывел только одну ту Фамилию Имя которой я ввёл в форме
c массивами всё ок
names.txt:
Иван
Александр
Дима
surnames.txt:
Алексеев
Дмитреев
Петров

Сообщение изменено: Alex5 (16 июля 2006 - 09:25 )

  • 0

#2 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 16 июля 2006 - 09:37

Решил твою задачу несколько по-другому:

<?
$names = file("data/names.txt");
$surnames = file("data/surnames.txt");

foreach($names as $key => $name) {
	if(trim($name) == $_POST['request']){
		 echo $surnames[$key];
		 break;
	}
}
?>

Сообщение изменено: Strelok (16 июля 2006 - 17:12 )

  • 0

#3 Alex5

Alex5
  • Пользователь
  • 42 сообщений

Отправлено 16 июля 2006 - 12:15

всё хорошо но на экран не выводится :((
  • 0

#4 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 16 июля 2006 - 12:35

Кинь ка ХТМЛ код формы...
  • 0

#5 Alex5

Alex5
  • Пользователь
  • 42 сообщений

Отправлено 16 июля 2006 - 13:02

<html>
<head>
<title>Form</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>

<body>

<table width="533" border="0" cellpadding="0" cellspacing="0">
<!--DWLayoutTable-->
<tr>
<td width="14" height="260"> </td>
<td width="483" valign="top"><form name="forma" method="post" action="test.php">
<p>
<input name="request" type="text" size="50" maxlength="50">
</p>
<p align="center"> <input name="imageField" type="image" src="/Components/active.gif" width="145" height="46" border="0">
</p>
</form>
<p> </p></td>
<td width="36"> </td>
</tr>
<tr>
<td height="97"> </td>
<td> </td>
<td> </td>
</tr>
</table>
</body>
</html>
это index.php

Сообщение изменено: Alex5 (16 июля 2006 - 13:03 )

  • 0

#6 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 16 июля 2006 - 17:13

подредактировал код - сечас работает?
  • 0

#7 zedirtybastard

zedirtybastard
  • Пользователь
  • 499 сообщений

Отправлено 18 июля 2006 - 15:39

<?
$names = file("data/names.txt");
$surnames = file("data/surnames.txt");

echo $surnames[array_search(trim($_POST['request']), $names)];

?>

3 строчки, кто меньше? :)

<?
echo file("data/surnames.txt")[array_search(trim($_POST['request']), file("data/names.txt"))];
?>

Пох, одна строчка :)
  • 0

#8 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 19 июля 2006 - 14:41

zedirtybastard, красиво, молодец, но PHP не Perl
  • 0

#9 zedirtybastard

zedirtybastard
  • Пользователь
  • 499 сообщений

Отправлено 19 июля 2006 - 18:54

На перле побольше получается

use CGI;
use strict; #nu privyk ja k strict

open (NAMES, "data/names.txt")
my @names = <NAMES>;
close (NAMES);

open (SURNAMES, "data/surnames.txt");
my @surnames = <SURNAMES>;
close (SURNAMES);

for(my $i=0; $i<scalar(@surnames); $i++) { print $surnames[$i] if ($names[$i] eq $CGI->param("request"));break;}


хотя опять-таки можно упростить :)
проблема в том, что в перле надо закрыть stdin перед тем как его вывести, поэтому делаем отдельную функцию
use CGI;use strict;sub o{open(D,"data/".shift);@$a=<D>;close(D);return $a;}for(my $i=0;$i<scalar(my $n=o("names"));$i++) {print &o("surnames")[$i] if ($n[$i] eq $CGI->param("request"));break;}

Только я вас умоляю, где бы вы ни работали - НИКОГДА НЕ ПИШИТЕ ТАКОЙ КОД!

И вообще, делал бы на беркли - не было бы проблем!
### structura berkley = $hash{name} = "surname";
use DB_File;
use Fcntl;
use CGI;
use strict;

my $berkley = tie my %names, "DB_File", "data/names.db" , O_RDWR|O_CREAT, 0666, $DB_HASH;
print $names{$CGI->param("request")};

## a esli imja po familii
foreach (keys(%names)) {
   print $_ if ($names{$_} eq $CGI->param("request")); break;}
ПЕРЛ адназначна рулит, бросайте свой пакостный РНР :)

Сообщение изменено: zedirtybastard (19 июля 2006 - 19:23 )

  • 0

#10 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 19 июля 2006 - 20:48

zedirtybastard, кстати не знаю тестил ли ты код на ПХП, там теоретически получается что в элементах file("data/names.txt") в конце символ перевода строки, а в конце $_POST['request'] ничего нет. Можно конечно искать по имени + перевод строки, но а кто знает какой там перевод? \n или \r\n?
А примерами впечатлен, тока ты наверное напугал автора до смерти:))
  • 0

#11 zedirtybastard

zedirtybastard
  • Пользователь
  • 499 сообщений

Отправлено 19 июля 2006 - 21:32

не не не, насколько я знаю, file именно по переносу строки и разбивает, т.е это что-то типа

$f = fopen("file", r);
$file = split("\n", fread($f, filesize("file")));

Хотя я в РНР не очень, честно скажу :)

А насчет примеров .. ну почему же запугал? По-моему, наоборот прикольно когда код можно сжать до таких пределов.
А перл мне именно этим и нравится, в нем такие подвыперты можно делать, РНР и не снилось :)
Вообще, там же ничего такого в примерах не написано, просто пробелы убраны и переносы строк + в перле немного нахимичено, зато явно видно, как можно избавиться от ненужных переменных и уменьшить размер кода

Сообщение изменено: zedirtybastard (19 июля 2006 - 21:38 )

  • 0

#12 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 20 июля 2006 - 01:07

zedirtybastard, я тоже так раньше думал, но мануал говорит об обратном

"Каждый элемент возвращенного массива содержит соответствующую строку с символами конца строки"
http://ee.php.net/file

Подвыперты они конечно прикольны, если не придется код вместе с кем-то писать, или даже самому через год скажем в нем разбираться

Сообщение изменено: Акей (20 июля 2006 - 01:08 )

  • 0

#13 Alex5

Alex5
  • Пользователь
  • 42 сообщений

Отправлено 20 июля 2006 - 10:56

простите...я уже ядро переводчика сделал...не надо больше помогать
щас дизайнера ищу...:) но спасибо за помощь
тема закрыта
  • 0

#14 zedirtybastard

zedirtybastard
  • Пользователь
  • 499 сообщений

Отправлено 20 июля 2006 - 12:58

zedirtybastard, я тоже так раньше думал, но мануал говорит об обратном

"Каждый элемент возвращенного массива содержит соответствующую строку с символами конца строки"
http://ee.php.net/file

Подвыперты они конечно прикольны, если не придется код вместе с кем-то писать, или даже самому через год скажем в нем разбираться


Ага :) Для корпоративной работы не подходит даже обычный стиль программирования, надо все документировать, ставить комментарии и жестко соблюдать форматирование. Про такие вещи как <? ... ?>
внутри HTML я вообще не говорю. Если честно, я понимаю, что данный способ программирования удобен для новичков, но для более менее серьезных проектов я бы отрывал яйца за скрипты внутри HTML, все-равно надо использовать темплейтный движок, а это возвращает нас в перл :)

И для серьезных проектов где работает не один человек, надо безусловно использовать ООП.

простите...я уже ядро переводчика сделал...не надо больше помогать
щас дизайнера ищу...smile.gif но спасибо за помощь
тема закрыта

Вот с чем-чем, а с дизайном уже точно не поможем, хотя если будешь искать дизайнейра, ищи тех, кто очень хорошо разбирается в CSS, а то местные умельцы намалюют тебе в фотошопе картинку, заслайсают ее и потребуют денег
  • 0