Народ помогите туплю уже пару часов, Есть: Двумерный массив - примере ниже. Количество элементов во всех массивах 2-го уровня всегда одинаково, т.е. может быть везде например по 5, ну и в массиве top все элементы всегда имеют значение. Нужно: Если элементы массива с одинаковым ключом пусты (кроме массива top соответственно. в примере ниже это элементы с ключом 0) то удалить все элементы с данным ключом во всех массивах 2-го уровня. Количество совпадающих по ключам пустых элементов может не быть, а могут быть пусты все Код (Text): <?php $test = array( "top" => array( 0 => "Значение", 1 => "Значение", 2 => "Значение" ), 0 => array( 0 => "", 1 => "", 2 => "Значение" ), 1 => array( 0 => "", 1 => "Значение", 2 => "" ), 2 => array( 0 => "", 1 => "Значение", 2 => "Значение" ) ); ?>
PHP: $test = array( "top" => array( 0 => "Значение", 1 => "Значение", 2 => "Значение" ), 0 => array( 0 => "", 1 => "", 2 => "Значение" ), 1 => array( 0 => "", 1 => "Значение", 2 => "" ), 2 => array( 0 => "", 1 => "Значение", 2 => "Значение" ) ); print_r($test); foreach ($test as $mainKey=>$subArr) { foreach ($subArr as $key=>$item) { if($item == ""){ unset($test[$mainKey][$key]); } } } print_r($test); так?
Нет, в данном примере если test[0][0] && test[1][0] && test[2][0] == "" то unset($test['top'][0], test[0][0], test[1][0], test[2][0]);
Сделал ежик из костылей, может кто предложит получше вариант Код (Text): <?php $test = array( "top" => array( 0 => "Значение", 1 => "Значение", 2 => "Значение" ), 0 => array( 0 => "", 1 => "", 2 => "Значение" ), 1 => array( 0 => "", 1 => "", 2 => "" ), 2 => array( 0 => "", 1 => "Значение", 2 => "Значение" ) ); $arr = $test; $c = count($arr['top']); unset($arr['top']); $empty = array(); foreach($arr as $k1 => $arr2){ for($i=0; $i<$c; $i++){ if($arr2[$i] == ""){ $empty[$i]++; }; if($empty[$i] == $c){$arr_empty[$i] = 1;} } } if(isset($arr_empty)){ foreach($test as $k1 => $v1){ foreach($arr_empty as $k2 => $v2){ if(isset($test['top'][$k2])) unset($test['top'][$k2]); unset($test[$k1][$k2]); } } } echo '<pre>',print_r($test),'</pre>'; ?> [code]
PHP: $test = array( "top" => array( 0 => "Значение", 1 => "Значение", 2 => "Значение" ), 0 => array( 0 => "", 1 => "Значение", 2 => "Значение" ), 1 => array( 0 => "", 1 => "Значение", 2 => "" ), 2 => array( 0 => "", 1 => "Значение", 2 => "Значение" ) ); $array = $test; unset($array['top']); $result = []; $need = count($array); for ($i = 0; $i < count($array[0]); $i++) { $have = 0; $tmp = $result; foreach ($array as $k => $v) { if ($v[$i] === "") { continue; } $have++; $tmp[$k][$i] = $v[$i]; if ($have == $need) { $result = $tmp; } } } print_r($result); Результат: Код (Text): Array ( [0] => Array ( [1] => Значение ) [1] => Array ( [1] => Значение ) [2] => Array ( [1] => Значение ) )
Почти то, но в результате должно выводиться (результат ниже), то есть должны удаляться элементы только если они пусты во всех (кроме [top]) массивах 2-го уровня имеющих один ключ, и данный ключ должен удаляться из [top] Мое решение тоже не работает в случае увеличения количества элементов в массивах второго уровня, вроде несложная проблема, а времени уже кучу убил Код (Text): Array ( [top] => Array ( [1] => Значение [2] => Значение ) [0] => Array ( [1] => Значение [2] => Значение ) [1] => Array ( [1] => Значение [2] => ) [2] => Array ( [1] => Значение [2] => Значение ) )
Добро пожаловать в офис мастера костылей и высоких нагрузок. PHP: $arrInp = array( "top" => array( 0 => "Значение", 1 => "Значение", 2 => "Значение" ), 0 => array( 0 => "", 1 => "", 2 => "Значение" ), 1 => array( 0 => "", 1 => "Значение", 2 => "" ), 2 => array( 0 => "", 1 => "Значение", 2 => "Значение" ) ); $wrcCntLv1 = count($arrInp) - 1; $wrcCntLv2 = count($arrInp['top']); $codeArr = array(); for ( $i = 0; $i < $wrcCntLv2; $i++ ) { for ( $k = 0; $k < $wrcCntLv1; $++ ) { $codeArr[] = "emty(\$arrInp[$k][$i])"; } $code = "if ("; $LstItPos = count($codeArr) - 1; for ( $z = 0; $z < count($codeArr); $z++ ) { if ( $z == $LstItPos ) { $code .= $codeArr[$z]; } else { $code .= $codeArr[$z]." &&"; } } $code .= ") \{ foreach ( \$arrInp as \$key=>\$val ) \{ unset(\$arrInp[\$key][$i]); \} \}"; eval($code); } Поржал от души, но должно работать. Комментировать и проверять нет времени. Надо бежать. Если не будет работать, то не пытайся разобраться. Я приду и отлажу сам. --- Добавлено --- это при условии:
Ошибок было несколько синтаксических и логических. Вот новый отлаженный код: PHP: $arrInp = array( "top" => array( 0 => "Значение", 1 => "Значение", 2 => "Значение" ), 0 => array( 0 => "", 1 => "", 2 => "Значение" ), 1 => array( 0 => "", 1 => "Значение", 2 => "" ), 2 => array( 0 => "", 1 => "Значение", 2 => "Значение" ) ); $wrcCntLv1 = count($arrInp) - 1; $wrcCntLv2 = count($arrInp['top']); $codeArr = array(); for ( $i = 0; $i < $wrcCntLv2; $i++ ) { for ( $k = 0; $k < $wrcCntLv1; $k++ ) { $codeArr[] = " empty(\$arrInp[$k][$i])"; } $code = "if ("; $LstItPos = count($codeArr) - 1; for ( $z = 0; $z < count($codeArr); $z++ ) { if ( $z == $LstItPos ) { $code .= $codeArr[$z]; } else { $code .= $codeArr[$z]." &&"; } } $code .= ") { foreach ( \$arrInp as \$key=>\$val ) { unset(\$arrInp[\$key][$i]); } }"; eval($code); unset($codeArr); }
здесь похоже без костылей не обойтись))) я уже тоже запустил, уж не знаю что лучше PHP: $test = array( "top" => array( 0 => "top 0", 1 => "top 1", 2 => "top 2", 3 => "top 3", 4 => "top 4" ), 0 => array( 0 => "", 1 => "", 2 => "Значение 0 2", 3 => "Значение 0 3", 4 => "" ), 1 => array( 0 => "", 1 => "", 2 => "", 3 => "Значение 1 3", 4 => "" ), 2 => array( 0 => "", 1 => "", 2 => "Значение 2 2", 3 => "Значение 2 3", 4 => "" ) ); $arr = $test; unset($arr['top']); $arr_empty = array(); $c = count($arr); // Вычисляем ключи у которых заначения = "" во всех массивах 2-го уровня for ($i = 0; $i < count($arr[0]); $i++) { $empty = 0; $tmp = $arr_empty; foreach ($arr as $k => $v) { if ($v[$i] !== "") continue; $empty++; $tmp[$i] = 1; if ($empty == $c) $arr_empty = $tmp; } } // Удаляем строку с пустыми значениями if(isset($arr_empty)){ foreach($test as $k1 => $v1){ foreach($arr_empty as $k2 => $v2){ if(isset($test['top'][$k2])) unset($test['top'][$k2]); unset($test[$k1][$k2]); } } } echo '<pre>',print_r($test),'</pre>';
Если ПХП, то всё проще. Как-то так: PHP: $test = array( "top" => array(0 => "Значение",1 => "Значение",2 => "Значение"), 0 => array(0 => "",1 => "",2 => "Значение"), 1 => array(0 => "",1 => "Значение",2 => ""), 2 => array(0 => "",1 => "Значение",2 => "Значение") ); $filter = []; // Подсчёт количества array_walk_recursive($test, function($v, $key) use(&$filter) { @$filter[$key] += (int)($v === ''); }); // условие: исключаемые должны быть у всех $count = count($test) - 1; // условие: первый не учитывать $filter = array_filter($filter, function($v) use($count) { return $v >= $count;}); // условие: удалить у всех foreach($test as $k=>&$a) { $a = array_filter($a, function($key) use($filter) { return !isset($filter[$key]); }, ARRAY_FILTER_USE_KEY); } var_dump($test);