PHP: <?php //Дан массив: $array = ['q','w','e','r','t','y']; //Из него нужно удалить все четные элементы ?>
Не в обиду Можно просто обойтись PHP: unset($array[$key]); и не пересоздавать массив А так прав, вариантов 6 как минимум точно есть))
PHP: <?php //Дан массив: $array = ['q','w','e','r','t','y']; echo "<pre>"; print_r($array); /* Array ( [0] => q [1] => w [2] => e [3] => r [4] => t [5] => y ) */ foreach(array_filter(array_keys($array), function($key) {return !($key & 1);}) as $key) unset($array[$key]); print_r($array); /* Array ( [1] => w [3] => r [5] => y ) */ ?>
Решение №2 PHP: array_walk($array, function ($value, $key) { global $array; if(!($key & 1)) unset($array[$key]); }); Решение №3 PHP: for ($i=0; $i <= count($array); $i=$i+2) { unset($array[$i]); } Решение №4 PHP: $i=0; while ($i<=count($array)) { unset($array[$i]); $i+=2; }
Оставлю свой вариант PHP: $array = ['q','w','e','r','t','y']; $result = array_filter($array, fn ($i) => ! ($i % 2), ARRAY_FILTER_USE_KEY); print_r($result);
Вы задали вопрос: PHP: //Дан массив: $array = ['q','w','e','r','t','y']; //Из него нужно удалить все чётные элементы Ваш вариант не удаляет все чётные элементы из массива $array, а копирует нечётные элементы из этого массива в массив $result.
Дополнение. Простой тест показывает, что наилучшее решение. PHP: for ($i=0; $i <= count($array); $i=$i+2) { unset($array[$i]); } Execution time: 0.227 ms Ваш вариант PHP: $result = array_filter($array, fn ($i) => ! ($i % 2), ARRAY_FILTER_USE_KEY); Execution Time: 1.5817 ms Тест PHP: <?php //Дан массив: //$array = ['q','w','e','r','t','y']; ############################################### function getExecutionTime($time_start){ return (hrtime(true) - $time_start)/1e+6; } ############################################### $array = str_split(file_get_contents("https://php.ru/")); echo "Count array: ", count($array),"<hr>"; echo 'Code 1.<br> $result = array_filter($array, fn ($i) => ! ($i % 2), ARRAY_FILTER_USE_KEY);<br>'; $time_start = hrtime(true); $result = array_filter($array, fn ($i) => ! ($i % 2), ARRAY_FILTER_USE_KEY); $executionTime1 = getExecutionTime($time_start); echo "<b>Execution Time1:</b> $executionTime1 ms<hr>"; ###################################################################### echo 'Code 2.<br> $i=0;<br> while ($i<=count($array)) {<br> unset($array[$i]);<br> $i+=2;<br> }<br>'; $time_start = hrtime(true); $i=0; while ($i<=count($array)) { unset($array[$i]); $i+=2; } $executionTime2 = getExecutionTime($time_start); echo "<b>Execution time2:</b> $executionTime2 ms<hr>"; ###################################################################### echo 'Code 3.<br>for ($i=0; $i <= count($array); $i=$i+2) {<br> unset($array[$i]);<br> }<br>'; $time_start = hrtime(true); for ($i=0; $i <= count($array); $i=$i+2) { unset($array[$i]); } $executionTime3 = getExecutionTime($time_start); echo "<b>Execution time3:</b> $executionTime3 ms<hr>"; ###################################################################### $diff = $executionTime1 - $executionTime2; echo "<b>Сode 2 is faster than Сode 1 by :</b> $diff ms<br>"; $diff = $executionTime1 - $executionTime3; echo "<b>Сode 3 is faster than Сode 1 by :</b> $diff ms<br>"; /* Count array: 23154 Code 1. $result = array_filter($array, fn ($i) => ! ($i % 2), ARRAY_FILTER_USE_KEY); Execution Time1: 1.5817 ms Code 2. $i=0; while ($i<=count($array)) { unset($array[$i]); $i+=2; } Execution time2: 0.2732 ms Code 3. for ($i=0; $i <= count($array); $i=$i+2) { unset($array[$i]); } Execution time3: 0.227 ms Сode 2 is faster than Сode 1 by : 1.3085 ms Сode 3 is faster than Сode 1 by : 1.3547 ms ?> Удачи!
Vladimir Kheifets, пара моментов. Первое, твой вариант не удаляет четные элементы из массива. И вообще данный подход не работает на массивах имеющих свыше шести элементов. Попробуй разобраться почему так происходит. Второе, при чтении подобного решения в коде, возникнет когнитивная нагрузка на читающего во время которой он будет пытаться понять что тут происходит, зачем итерируемый массив изменяет сам себя удаляя свои же элементы во время этих итераций. Эта нагрузка будет стоить дороже чем та экономия на спичках которую ты приводишь, если эта экономия там еще и будет.
Ощущение, что занимаюсь какой-то херней))) ну да ладно! PHP: <?php declare(strict_types = 1); //- Строгая типизация в PHP error_reporting(-1); //- Показываем все ошибки function getExecutionTime($time_start) { return (hrtime(true) - $time_start)/1e+6; } $array = str_split(file_get_contents("https://php.ru/")); $time_start = hrtime(true); //- 1 вариант в среднем 3,5 /* foreach ($array as $key => $value) { if ($key % 2 == 0) { // Удаляем элементы с четными индексами unset($array[$key]); } } */ /* //- 2 вариант в среднем 4.7 $result = array_filter($array, function($key) { return $key % 2 !== 0; // Оставляем элементы с нечетными индексами }, ARRAY_FILTER_USE_KEY); */ /* //- 3 вариант в среднем 2.5 $newArray = []; foreach ($array as $key => $value) { if ($key % 2 !== 0) { // Добавляем элементы с нечетными индексами $newArray[] = $value; } } */ /* //- 4 вариант в среднем 5.9 $keysToRemove = array_filter(array_keys($array), function($key) { return $key % 2 == 0; }); foreach ($keysToRemove as $key) { unset($array[$key]); } */ /* //- 5 вариант в среднем 7.4 array_walk($array, function($value, $key) use (&$array) { if ($key % 2 == 0) { unset($array[$key]); } }); */ /* //- 6 вариант в среднем 2.5 // Итерируем в обратном порядке, чтобы не пропустить элементы после удаления for ($i = count($array) - 1; $i >= 0; $i--) { if ($i % 2 == 0) { // Проверяем, является ли индекс четным unset($array[$i]); } } // Для корректного вывода массива с последовательными индексами $array = array_values($array); */ //print_r($result); $executionTime1 = getExecutionTime($time_start); echo "<b>Execution Time1:</b> $executionTime1 ms<hr>"; ?> Позаимствовал чуть кода у Vladimir Kheifets. Закомментировал каждый из тестов + описание. Насколько я понимаю, то время выполнения может, и зависит от многих факторов, как параметры сервера, так и версия php + нагрузка. При работе с маленькими массивами, я думаю, что можно использовать любой из вариантов. Главное ведь что? - достичь цели)) p.s. параметры где тестировалось: Debian 10 (Buster), nginx/1.14.2, PHP 8.3.0 Intel Xeon D1540 - 8c/16t - 2 GHz/2.6 GHz 32 GB ECC 2133 MHz 2×450 GB SSD NVMe 250 Mbps outgoing
А так? PHP: //$array = ..... $new_array = array_column(array_chunk($array, 2), 0); $print_r($new_array);
Не понял, чем array_filter() не устроил: PHP: <?php echo "<pre>"; $array = ['q','w','e','r','t','y']; print_r($array); $array = array_filter( $array, function ($key) { return $key & 1; }, ARRAY_FILTER_USE_KEY ); print_r($array);