Chcę zgrupować listę słów w tablicy z początkową literą.

function alpha($str) {
    $result[substr($str,0,1)] = $str;
    return $result;
}

$a = ['abc','cde','frtg','acf'];
$b = array_map('alpha', $a);
print_r($b);

Czego potrzebuję:

Array
(
    [a] => abc,acf
    [c] => cde
    [f] => frtg
)

Co dostaję:

Array
(
    [0] => Array
        (
            [a] => abc
        )
    [1] => Array
        (
            [c] => cde
        )
    [2] => Array
        (
            [f] => frtg
        )
    [3] => Array
        (
            [a] => acf
        )
)
1
WalterV 20 czerwiec 2021, 20:30

5 odpowiedzi

Najlepsza odpowiedź

Co ty na to :

$answer = [];
$a = ['abc','cde','frtg','acf'];

foreach($a as $word){
    $key = substr($word,0,1);
    
    if (isset($answer[$key])){
        $answer[$key] .= "," . $word;
    } else {
        $answer[$key] = $word;
    }
    
}
2
wannabesenior 20 czerwiec 2021, 17:41

Myślę, że twoim zamiarem jest przechowywanie każdego słowa w tablicach zgodnie z jego pierwszą literą. W takim przypadku tablica wielowymiarowa jest właściwym wyborem.

$array = ['abc','cde','frtg','acf'];
$new_array = array();
foreach($array as $v){
  $letter = substr($v,0,1);
  if(!isset($new_array[$letter])) {$new_array[$letter] = array();}
  array_push($new_array[$letter], $v);
}

print_r($new_array);
0
dspillai 21 czerwiec 2021, 16:49

Funkcja array_map mapuje do oryginalnych indeksów, ale potrzebujesz nowych indeksów i zmienionej tablicy, jeśli istnieje więcej wartości z tym samym początkowym znakiem. Dlatego array_map nie działają dla Ciebie. Możesz stworzyć nową tablicę w ten sposób:

$a = ['abc','cde','frtg','acf'];
$b = Array();
$c = Array();

foreach( $a as $v )
{
    // multidimensional array
    $b[substr($v,0,1)][] = $v;

    // comma separated string
    $c[substr($v,0,1)] = (isset($c[substr($v,0,1)])) ? 
                         $c[substr($v,0,1)].",$v" : $v;
}
1
Engel 20 czerwiec 2021, 19:40

Po prostu dodaj zmienną $c i zapętlaj tablice tablicy za pomocą dwóch foreach i grupuj według alfabetu...

function alpha($str) {
    $result[substr($str,0,1)] = $str;
    return $result;
}
$a = ['abc','cde','frtg','acf'];
$b = array_map('alpha', $a);
#print_r($b);

$c = [];
foreach ($b as $key => $values) {
    foreach ($values as $key => $value) {
        if(!isset($c[$key])){
            $c[$key]=$value;
        }else{
            $c[$key].= "," . $value;
        }
    }
}
echo "<PRE>";
print_r($c);

Wyjście:

Array
(
    [a] => abc,acf
    [c] => cde
    [f] => frtg
)
1
Mehdi Taher 20 czerwiec 2021, 17:47

Jeśli pierwszy znak może być również wielobajtowym Unicode, takim jak ° lub €, mb_substr () musi być użyty! Rozwiązanie z foreach:

$result = [];
$a = ['abc','€de','frtg','acf'];

foreach($a as $word){
    $key = mb_substr($word,0,1);
    $result[$key] = array_key_exists($key,$result) 
       ? ($result[$key].",".$word)
       : $word
    ;
}

Rozwiązanie z array_reduce():

$result = array_reduce($a,function($carry,$item){
  $key = mb_substr($item,0,1);
  $carry[$key] = array_key_exists($key,$carry) ? ($carry[$key].",".$item) : $item;
  return $carry;
  },[]);

var_export($result);

Wynik:

array (
  'a' => 'abc,acf',
  '€' => '€de',
  'f' => 'frtg',
) 
1
jspit 21 czerwiec 2021, 08:44