Demon можно так: PHP: <? $array = array( "one" => "один", "two" => "" ); foreach($array as $index => $value) { if( $value == "" ) { unset($array[$index]); } } print_r($array); и вот так: PHP: <? $array = array( "one" => "один", "two" => "", "three" => "", "four" => "четыре" ); while($key = array_search('', $array)) { unset($array[$key]); } print_r($array);
А есть еще варианты удаления пустых ключей из массива? А то оба примера, которые привел Hight глючат..
Допустим, в форме есть 5 инпутов с value="Text". В качестве переменных для всех инпутов автомассив. После отправки данных, если в инпутах по-прежнему пресутствует слово "Text", оно c помощью str_replace заменяется на пустое значение, потом автомассив сериализуется и записывается в БД. После извлечения сериализованного массива из БД, и применения к нему сначала unserialize, а потом кода, который посоветовал Hight, пустые ключи, которым должно было соответствовать пустое значения после применения к инпутам str_replace, не удаляются. А вот если при отправке данных стереть все слова "Text" из инпутов, и потом применить unserialize и код для удаления ключей - ключи спокойно удаляются..
Перед удалением элементов массивов, посмотри какой массив на самом деле обрабатываешь - print_r($ar);
PHP: <? $number = $_POST['number']; $linksname = $_POST['linksname']; $linkshref = $_POST['linkshref']; $submit = $_POST['submit']; switch($albums): case("ed"): if($submit) { mysql_connect("localhost", "root", "1") or die("Невозможно подключиться к БД!"); mysql_select_db("1") or die("БД не существует!"); mysql_query("INSERT INTO audio()") or die("Невозможно произвести запись результатов!"); } include("edit/selection.inc"); if($noa && $selection <= 31) { mysql_connect("localhost", "root", "") or die("Невозможно подключиться к БД!"); mysql_select_db("1") or die("БД не существует!"); $sql = mysql_query("SELECT * FROM audio WHERE id = '$selection'"); while($row = mysql_fetch_array($sql)) { $albumarray = unserialize($row["album"]); $songarray = unserialize($row['linksname']); $hrefsarray = unserialize($row['linkshref']); include("edit/head.inc"); foreach ($albumarray as $key => $value) { echo "<input type=\"text\" value=\"$value\" />"; } include("edit/center.inc"); if($songarray == null or $hrefsarray == null) { } else { include("edit/bottom.inc"); echo "<div id=\"songlist\">"; while($key = array_search('', $songarray) and $secondkey = array_search('', $hrefsarray)) { unset($songarray[$key]); unset($hrefsarray[$secondkey]); } foreach ($songarray as $key => $song) { $song = stripslashes($song); echo "<input name=\"linkname[]\" value=\"$song\">"; } echo "</div>"; foreach ($hrefsarray as $key => $href) { $href = stripslashes($href); echo "<input name=\"linkname[]\" value=\"$href\">"; } echo "</div>"; } echo " <input type=\"submit\" id=\"submit\" name=\"submit\" value=\"Отправить...\"> </div> </form> </body> </html>"; } } break; case("add"): if($submit) { include_once ("./notice/info.html"); echo "<br />"; $_POST['linkshref'] = str_replace("Ссылка..", "", $_POST['linkshref']); $_POST['linksname'] = str_replace("Имя песни..", "", $_POST['linksname']); $album = addslashes(serialize($_POST['addalbum'])); $linkname = addslashes(serialize($_POST['linksname'])); $linkhref = addslashes(serialize($_POST['linkshref'])); mysql_connect("localhost", "root", "1") or die("Невозможно подключиться к БД!"); mysql_select_db("1") or die("БД не существует!"); mysql_query("INSERT INTO audio(album, linksname, linkshref) VALUES ('$album', '$linkname', '$linkhref')") or die($error = true); $sql = mysql_query("SELECT album FROM audio"); } include("add/add.htm"); echo "<div id=\"songlist\">"; for($i=1; $i<=$number; $i++) { echo "<input name=\"linksname[]\" value=\" Имя песни..\">"; } echo "</div>"; echo "<div id=\"linkslist\">"; for($i=1; $i<=$number; $i++) { echo "<input name=\"linkshref[]\" value=\" Ссылка..\">"; } echo "</div>"; echo "</div> <input type=\"submit\" id=\"submit\" name=\"submit\" value=\"Отправить...\"> </form> </body> </html>"; break; endswitch; ?>
Это вот этот строки удаляют элементы? Код (Text): while($key = array_search('', $songarray) and $secondkey = array_search('', $hrefsarray)) { unset($songarray[$key]); unset($hrefsarray[$secondkey]); } Тогда не стоит говорить, что код Hight не рабоает. Это Ваш не работает. С утра не хочется разбираться с логическим выражением, еще не проснулся, но у Вас точно нарушен приоритет вычислений.
А что разве так нельзя делать?..Чтобы два раза не писать while(..) {} Код (Text): while($key = array_search('', $songarray) and $secondkey = array_search('', $hrefsarray))
Наверное, с утра я погорячился на счет приоритетов, но все равно бы расставил скобки. А теперь начинаем изучать логику на примерах. Demon, сколько раз выполнится цикл, если, например, в массиве $songarray будут 5 элементов с пустыми полями, а $secondkey не будет пустых значений? P.S. Я бы отказался от использования второго варианта Hight, потому что при больших массивах, где много пустых значений, это будет сильно тормозить. Ведь поиск в функции array_search осуществляется простым циклом, пусть даже и на машинных кодах. А если будет, например, массив даже из 100 элементов, из них 50 пустые и находятся в конце массива, то нужно будет выполнить что-то среднее (арифметическое или геометрическое) между 50*50 и 100*50 сравнений. В то время как по первому варианту Hight нужно будет сделать 100 сравнений.
А я бы попробовал сделать через array_map — им можно обработать два массива одновременно, если так уж хочется. Либо array_walk тоже можно пройти.
Так пример с while работает (почти), как надо, только я не могу понять, почему не удаляются ключи, с пустыми значениями обработанных str_replace, инпутов.. После str_replace делаю print_r() обработанного массива - пустые ключи в нем присутствуют.. Мда..
PHP: <?php $a = array( '0' => '1', '1' => '2', '2' => '', '3' => '', '4' => '5', ); foreach($a as $val) { if (!empty($val)) $b[]=$val; } print_r($b); ?>
И что вы мне этим примером хотите показать?.. Имеется: Вводим значения: Производим замену Имя песни.. и Ссылка.. на пустое значение с помощью str_replace, записываем в БД, потом достаем из нее сериализованные массив -> unserialize -> попытка удаления пустых ключей. Получаем: Имеется: Вводим значения: Записываем в БД, потом достаем из нее сериализованные массив -> unserialize -> попытка удаления пустых ключей. Получаем: :? :? :? print_r(массив, в котором была произведена замена с помощью str_replace) Код (Text): <? Array ( [0] => Текст [1] => [2] => Текст 2 ) ; ?> print_r(массив второго варианта, без str_replace) Код (Text): <? Array ( [0] => Текст [1] => [2] => Текст 2 ) ; ?> Как видите, массивы одинаковые, однако ключи в первом случае не удаляются.