|
|
|
| Есть обычный список в текстовом файле:
red
green
yellow
а нужно, чтобы был такого вида:
array("red", "green", "yellow")
Наверное, есть какая-то функция, но не могу её найти... | |
|
|
|
|
|
|
|
для: Petter
(30.07.2009 в 22:27)
| | file() | |
|
|
|
|
|
|
|
для: Николай2357
(30.07.2009 в 23:06)
| | file() к сожалению не до конца то, что мне нужно...
Эта функция превращает текстовый файл в массив строк, где каждый элемент - это новая строка. Я это делал, конечно. В результате получается после распечатки
Array (
[0] => red
[1] => green
[2] => yellow
)
А мне, если Вы читали вопрос, нужен массив вида
array("red", "green", "yellow")
Мне это нужно для того, чтобы применить функцию разности массивов array_diff(),
которая работает с массивами такого вида. | |
|
|
|
|
|
|
|
для: Petter
(30.07.2009 в 23:13)
| | array_map(), rtrim()
Или как вариант, соответствующая опция функции file() | |
|
|
|
|
|
|
|
для: Trianon
(30.07.2009 в 23:29)
| | Спасибо, но я совершенно не представляю, как можно в данном случае использовать array_map() | |
|
|
|
|
|
|
|
для: Petter
(31.07.2009 в 00:57)
| | array_map позволяет применить другую функцию к каждому элементу указанного массива и получить массив из элементов после такой обработки. | |
|
|
|
|
|
|
|
для: Trianon
(30.07.2009 в 23:29)
| | Или как вариант, соответствующая опция функции file()
А можно чуть подробнее, FILE_IGNORE_NEW_LINES почему то не отработала... | |
|
|
|
|
|
|
|
для: Николай2357
(31.07.2009 в 01:20)
| | А можно чуть подробнее? | |
|
|
|
|
|
|
|
для: 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()... Правда это не значит, что если поставить, то не нужно... Но странно все таки. | |
|
|
|
|
|
|
|
для: Николай2357
(31.07.2009 в 01:52)
| | Возможно она не обрабатывает windows переходы, а unix нормально будет. На Денвере она у меня никогда и не работала. Но строка может содержать лишние пробелы, что может тоже быть причиной нежелательных явлений. Я поэтому считаю, что опция эта для понту, всего не учитывает.) | |
|
|
|
|
|
|
|
для: Николай2357
(31.07.2009 в 01:52)
| | выполните двоичный вывод содержимого массива, полученного с этой опцией и без.
Дальше можно будет что-то обсуждать. | |
|
|
|
|
|
|
|
для: Николай2357
(31.07.2009 в 01:20)
| | У меня тоже не работает установка этого флага, я для верности всегда trim использую.) | |
|
|
|
|
|
|
|
для: Petter
(30.07.2009 в 23:13)
| | array_diff() может работать как по значениям, так и по ключам/индексам, array("red", "green", "yellow") даст такую же распечатку как и после file(), так как у любого массива есть индекс. | |
|
|
|
|
|
|
|
для: sim5
(30.07.2009 в 23:37)
| | Да, теоретически это так, а практически не вычитаются значения из массива при применении array_diff()
Попробую ещё раз... | |
|
|
|
|
|
|
|
для: Petter
(30.07.2009 в 23:50)
| | Это не теоретически, а если хотите, физическая модель массива, ибо любой из них отображается в памяти, где индекс его служит смещением в ней. И без смещения (индекса) вы никак не получите элемента массива.
И после file() вы не найдете прописанных в каждой строке [0]....[x], их там нет! Индексы будут присвоены автоматически и видите вы их лишь только в print_r(). | |
|
|
|
|
|
|
|
для: Petter
(30.07.2009 в 23:13)
| | А мне, если Вы читали вопрос, нужен массив вида
array("red", "green", "yellow")
А если Вы распечатаете свой массив, то что получите?
<?
print_r(array("red", "green", "yellow"));
|
| |
|
|
|
|
|
|
|
для: Николай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: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);
Очень обидно, что не удаётся использовать эту функцию... | |
|
|
|
|
|
|
|
для: 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);
|
| |
|
|
|
|
|
|
|
для: sim5
(31.07.2009 в 00:19)
| | Увы, sim5,
это не совсем то, это так случайно совпало, что в первом и втором массиве [0] => red
А если в массиве $a будет green red yellow? Тогда получается, что array_diff() снова не работает!
Вы же сами прекрасно понимаете, что сравниваются значения
Почему же всё-таки не действует эта функция? Ведь в теории сказано, что её интересуют лишь значения (values)? | |
|
|
|
|
|
|
|
для: 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 сами подумайте для чего. | |
|
|
|
|
|
|
|
для: 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>";
|
| |
|
|
|
|
|
|
|
для: Petter
(31.07.2009 в 01:16)
| | Странного ничего нет, так как строки ваши имеют символы окончания строки, могут содержать и пробелы случайные. Я же вам не зря сказал "если посмотреть....", и если посмотрели бы, то увидели бы после переворачивания массива вот такое
Плохо, что не РНР5, пора перходить, многое теряете. | |
|
|
|
|
|
|
|
для: sim5
(31.07.2009 в 01:36)
| | Спасибо, sim5!
эти строки - результат извлечения из $_REQUEST['']
Да, согласен, в них могут быть лишние пробелы...
И в конце строки тоже символы...
Это очень интересное решение: array_map('trim', ...)
Большое Вам спасибо, как, собственно говоря, и всем остальным, кто проявил сочувствие к вопросу... | |
|
|
|
|
|
|
|
для: Petter
(31.07.2009 в 01:16)
| | >Увы, даже протестировать не получилось, так как эта функция array_diff_key() из PHP5!
Здрааасте, приехали.
А мы здесь чем дышим? | |
|
|
|