Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как список переделать в Массив без вывода в броузер?
 
 автор: Petter   (30.07.2009 в 22:27)   письмо автору
 
 

Есть обычный список в текстовом файле:

red
green
yellow

а нужно, чтобы был такого вида:
array("red", "green", "yellow")

Наверное, есть какая-то функция, но не могу её найти...

  Ответить  
 
 автор: Николай2357   (30.07.2009 в 23:06)   письмо автору
 
   для: Petter   (30.07.2009 в 22:27)
 

file()

  Ответить  
 
 автор: Petter   (30.07.2009 в 23:13)   письмо автору
 
   для: Николай2357   (30.07.2009 в 23:06)
 

file() к сожалению не до конца то, что мне нужно...
Эта функция превращает текстовый файл в массив строк, где каждый элемент - это новая строка. Я это делал, конечно. В результате получается после распечатки
Array (
[0] => red
[1] => green
[2] => yellow
)

А мне, если Вы читали вопрос, нужен массив вида
array("red", "green", "yellow")

Мне это нужно для того, чтобы применить функцию разности массивов array_diff(),
которая работает с массивами такого вида.

  Ответить  
 
 автор: Trianon   (30.07.2009 в 23:29)   письмо автору
 
   для: Petter   (30.07.2009 в 23:13)
 

array_map(), rtrim()
Или как вариант, соответствующая опция функции file()

  Ответить  
 
 автор: Petter   (31.07.2009 в 00:57)   письмо автору
 
   для: Trianon   (30.07.2009 в 23:29)
 

Спасибо, но я совершенно не представляю, как можно в данном случае использовать array_map()

  Ответить  
 
 автор: Trianon   (31.07.2009 в 01:00)   письмо автору
 
   для: Petter   (31.07.2009 в 00:57)
 

array_map позволяет применить другую функцию к каждому элементу указанного массива и получить массив из элементов после такой обработки.

  Ответить  
 
 автор: Николай2357   (31.07.2009 в 01:20)   письмо автору
 
   для: Trianon   (30.07.2009 в 23:29)
 

Или как вариант, соответствующая опция функции file()
А можно чуть подробнее, FILE_IGNORE_NEW_LINES почему то не отработала...

  Ответить  
 
 автор: Trianon   (31.07.2009 в 01:36)   письмо автору
 
   для: Николай2357   (31.07.2009 в 01:20)
 

А можно чуть подробнее?

  Ответить  
 
 автор: Николай2357   (31.07.2009 в 01:52)   письмо автору
 
   для: Trianon   (31.07.2009 в 01:36)
 

Ну вот из моих экспериментов
<?php
$a 
file("1.txt",FILE_IGNORE_NEW_LINES); //red green yellow
//a = array_map('rtrim',$a);
$b file("2.txt",FILE_IGNORE_NEW_LINES); // red
//$b = array_map('rtrim',$b);
$c array_diff($a$b);
print_r($c); //выводит red green yellow


А в мануале написано
Each line in the resulting array will include the line ending, unless 
FILE_IGNORE_NEW_LINES is used, so you still need to use rtrim() if you do not want the line 
ending present.
То есть если не ставить опцию, то нужно rtrim()... Правда это не значит, что если поставить, то не нужно... Но странно все таки.

  Ответить  
 
 автор: sim5   (31.07.2009 в 02:06)   письмо автору
 
   для: Николай2357   (31.07.2009 в 01:52)
 

Возможно она не обрабатывает windows переходы, а unix нормально будет. На Денвере она у меня никогда и не работала. Но строка может содержать лишние пробелы, что может тоже быть причиной нежелательных явлений. Я поэтому считаю, что опция эта для понту, всего не учитывает.)

  Ответить  
 
 автор: Trianon   (31.07.2009 в 02:14)   письмо автору
 
   для: Николай2357   (31.07.2009 в 01:52)
 

выполните двоичный вывод содержимого массива, полученного с этой опцией и без.
Дальше можно будет что-то обсуждать.

  Ответить  
 
 автор: sim5   (31.07.2009 в 01:38)   письмо автору
 
   для: Николай2357   (31.07.2009 в 01:20)
 

У меня тоже не работает установка этого флага, я для верности всегда trim использую.)

  Ответить  
 
 автор: sim5   (30.07.2009 в 23:37)   письмо автору
 
   для: Petter   (30.07.2009 в 23:13)
 

array_diff() может работать как по значениям, так и по ключам/индексам, array("red", "green", "yellow") даст такую же распечатку как и после file(), так как у любого массива есть индекс.

  Ответить  
 
 автор: Petter   (30.07.2009 в 23:50)   письмо автору
 
   для: sim5   (30.07.2009 в 23:37)
 

Да, теоретически это так, а практически не вычитаются значения из массива при применении array_diff()
Попробую ещё раз...

  Ответить  
 
 автор: sim5   (30.07.2009 в 23:57)   письмо автору
 
   для: Petter   (30.07.2009 в 23:50)
 

Это не теоретически, а если хотите, физическая модель массива, ибо любой из них отображается в памяти, где индекс его служит смещением в ней. И без смещения (индекса) вы никак не получите элемента массива.
И после file() вы не найдете прописанных в каждой строке [0]....[x], их там нет! Индексы будут присвоены автоматически и видите вы их лишь только в print_r().

  Ответить  
 
 автор: Николай2357   (30.07.2009 в 23:52)   письмо автору
 
   для: Petter   (30.07.2009 в 23:13)
 

А мне, если Вы читали вопрос, нужен массив вида
array("red", "green", "yellow")

А если Вы распечатаете свой массив, то что получите?
<?
print_r
(array("red""green""yellow"));

  Ответить  
 
 автор: Petter   (31.07.2009 в 00:00)   письмо автору
 
   для: Николай2357   (30.07.2009 в 23:52)
 

$a = file("colors/top_color1.txt"); //red green yellow
$b = file("colors/top_color2.txt"); // red
$c = array_diff($a, $b);
print_r($c); //выводит red green yellow

  Ответить  
 
 автор: Petter   (31.07.2009 в 00:06)   письмо автору
 
   для: Petter   (31.07.2009 в 00:00)
 

А в таком варианте функция работает, как и написано в теории:

$a = array("red", "green", "yellow");
$b = array("red");
$c = array_diff($a, $b);
print_r($c);     //выводит green yellow

То есть мы "вычли" "red" из массива $а




Такой вариант тоже не работает, только что тестировал, хотя, казалось бы, массивы в том и другом случае:

$a = file("colors/top_color1.txt");
$b = array("red");
$c = array_diff($a, $b);
print_r($c);
Очень обидно, что не удаётся использовать эту функцию...

  Ответить  
 
 автор: sim5   (31.07.2009 в 00:19)   письмо автору
 
   для: Petter   (31.07.2009 в 00:06)
 

<?
$a 
file("top_color1.txt"); //red green yellow
$b file("top_color2.txt"); // red
$c array_flip(array_diff(array_flip($a), array_flip($b)));
print_r($c);

  Ответить  
 
 автор: Petter   (31.07.2009 в 00:40)   письмо автору
 
   для: sim5   (31.07.2009 в 00:19)
 

Увы, sim5,
это не совсем то, это так случайно совпало, что в первом и втором массиве [0] => red
А если в массиве $a будет green red yellow? Тогда получается, что array_diff() снова не работает!

Вы же сами прекрасно понимаете, что сравниваются значения

Почему же всё-таки не действует эта функция? Ведь в теории сказано, что её интересуют лишь значения (values)?

  Ответить  
 
 автор: sim5   (31.07.2009 в 01:01)   письмо автору
 
   для: Petter   (31.07.2009 в 00:40)
 

Вы просто не правильно все делаете. Во первых, если взять ваш пример гольный, и вывести массив на экран, то могут быть видны странности. Я вам говорил, и вы сами знаете, если обращались к мануалу, что можно сравнивать массивы по разному, в вашем случае тогда удобнее сравнивать по ключам:
<?
$a 
file("top_color1.txt"); //red green yellow 
$b file("top_color2.txt"); // red 
$a array_flip(array_map('trim'$a));
$b array_flip(array_map('trim'$b));
$c array_diff_key($a$b);
echo 
"<pre>";
print_r($a);
print_r($b);
print_r($c);
echo 
"</pre>";

trim сами подумайте для чего.

  Ответить  
 
 автор: Petter   (31.07.2009 в 01:16)   письмо автору
 
   для: sim5   (31.07.2009 в 01:01)
 

Спасибо, я попробую разобраться в этом листинге.
Увы, даже протестировать не получилось, так как эта функция array_diff_key() из PHP5!

Как это ни странно, работает вот такой код!

$a = file("colors/top_color1.txt"); //green red yellow  
$b = file("colors/top_color2.txt"); // red  
$a = array_map('trim', $a); 
$b = array_map('trim', $b); 
$c = array_diff($a, $b); 
echo "<pre>"; 
print_r($a); 
print_r($b); 
print_r($c); 
echo "</pre>";

  Ответить  
 
 автор: sim5   (31.07.2009 в 01:36)   письмо автору
 
   для: Petter   (31.07.2009 в 01:16)
 

Странного ничего нет, так как строки ваши имеют символы окончания строки, могут содержать и пробелы случайные. Я же вам не зря сказал "если посмотреть....", и если посмотрели бы, то увидели бы после переворачивания массива вот такое
[red
] => 0

Плохо, что не РНР5, пора перходить, многое теряете.

  Ответить  
 
 автор: Petter   (31.07.2009 в 01:47)   письмо автору
 
   для: sim5   (31.07.2009 в 01:36)
 

Спасибо, sim5!
эти строки - результат извлечения из $_REQUEST['']
Да, согласен, в них могут быть лишние пробелы...
И в конце строки тоже символы...
Это очень интересное решение: array_map('trim', ...)
Большое Вам спасибо, как, собственно говоря, и всем остальным, кто проявил сочувствие к вопросу...

  Ответить  
 
 автор: Trianon   (31.07.2009 в 02:12)   письмо автору
 
   для: Petter   (31.07.2009 в 01:16)
 

>Увы, даже протестировать не получилось, так как эта функция array_diff_key() из PHP5!

Здрааасте, приехали.
А мы здесь чем дышим?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования