Не могу нарезать массив - мне нужно разделить массив пополам - PullRequest
0 голосов
/ 13 января 2012

У меня есть массив, который выглядит так, как показано ниже.Я хочу разрезать его пополам и создать два новых массива из двух половинок.Однако, если я использую array_slice, он всегда возвращает ноль ... Я не понимаю, почему.

array
  'pic' => 
    array
      0 => string '740' (length=3)
      1 => string '741' (length=3)
      2 => string '742' (length=3)
      3 => string '748' (length=3)
  'alt' => 
    array
      0 => string '' (length=0)
      1 => string '' (length=0)
      2 => string 'Test caption 1' (length=14)
      3 => string 'Test caption 2' (length=14)

Массивы, которые мне нужны, должны сохранять ключи, просто разрезанные пополам, поэтому у меня есть две бесплатные половины.Например, первая половина должна выглядеть так:

array
  'pic' => 
    array
      0 => string '740' (length=3)
      1 => string '741' (length=3)
  'alt' => 
    array
      0 => string '' (length=0)
      1 => string '' (length=0)

, а вторая половина:

array
  'pic' => 
    array
      0 => string '742' (length=3)
      1 => string '748' (length=3)
  'alt' => 
    array
      0 => string 'Test caption 1' (length=14)
      1 => string 'Test caption 2' (length=14)

спасибо

пс - Майку, это то, что яиспользуя для создания массива, на самом деле он построен из других массивов:

$lodgepics = get_field('accommodation_rooms');
$featuredpics = get_field('featured_pics');
$showcasepics = array();
foreach ($featuredpics as $featuredpic) {
    if (isset($featuredpic['featured_pic'])&&!empty($featuredpic['featured_pic'])) $showcasepics[pic][] = $featuredpic['featured_pic'];
    if (isset($featuredpic['featured_alt'])) $showcasepics[alt][] = $featuredpic['featured_alt'];
else $showcasepics[alt][] = '';
}
foreach ($lodgepics as $lodgepic) {
    if(isset($lodgepic['accommodation_roomphoto'])&&!empty($lodgepic['accommodation_roomphoto'])) $showcasepics[pic][] = $lodgepic['accommodation_roomphoto'];
    if(isset($lodgepic['accommodation_roomname'])&&!empty($lodgepic['accommodation_roomname'])) $showcasepics[alt][] = $lodgepic['accommodation_roomname'];
    else $showcasepics[alt][] = '';
}

Ответы [ 3 ]

2 голосов
/ 13 января 2012

Это на самом деле массивы массивов. Первичный массив - это ассоциативный массив, поэтому вам нужно перебрать все ключи этого массива, чтобы получить кусочки:

$slice1 = array();
$slice2 = array();
foreach ($array as $key => $value)
{
    $slice1[$key] = array_slice($array[$key], ...);
    $slice2[$key] = array_slice($array[$key], ...);
}
1 голос
/ 13 января 2012

Мне трудно понять необходимость сделать что-то вроде того, что вы предлагаете, если бы это был я, я не заполнил бы массив, используя вашу структуру, я бы создал массив следующим образом:

array
  0 => 
    array
      'pic' => string '740' (length=3)
      'alt' => string '' (length=0)
  1 => 
    array
      'pic' => string '741' (length=3)
      'alt' => string '' (length=0)
  2 => 
    array
      'pic' => string '742' (length=3)
      'alt' => string 'Test Caption 1' (length=0)
  3 => 
    array
      'pic' => string '748' (length=3)
      'alt' => string 'Test Caption 2' (length=0)

Эта структура массива объединяет атрибуты изображения, а не разделяет их.

tomtheman5 имеет 80%, но не учитывает смещение и параметры длины для вызовов array_slice, которые необходимо передать, чтобы получить правильные срезы. Тем не менее, он делает хорошее замечание: если вы придерживаетесь структуры массива, вы можете столкнуться с проблемами, если у вас нет соответствующих элементов в каждом массиве 'pic' и 'alt'. Если это не проблема, рассмотрите следующий фрагмент:

$slice1 = array();
$slice2 = array();    

foreach ($array as $key => $value) {

    $arrayCount = count($array[$key]);
    $arrayHalfCount = ($arrayCount / 2);

    $slice1[$key] = array_slice($array[$key], 0, $arrayHalfCount);
    $slice2[$key] = array_slice($array[$key], $arrayHalfCount);
}

- Правка -

$lodgepics = get_field('accommodation_rooms');
$featuredpics = get_field('featured_pics');
$showcasepics = array();
foreach ($featuredpics as $featuredpic) {
    if ((isset($featuredpic['featured_pic'])) && (!empty($featuredpic['featured_pic']))) {
        $currentPic['pic'] = $featuredpic['featured_pic'];
        $currentPic['alt'] = (isset($featuredpic['featured_alt'])) ? $featuredpic['featured_alt'] : ''; 
        $showcasepics[] = $currentPic;
}
}

foreach ($lodgepics as $lodgepic) {
    if ((isset($lodgepic['accommodation_roomphoto'])) && (!empty($lodgepic['accommodation_roomphoto']))) {
        $currentPic['pic'] = $lodgepic['accommodation_roomphoto'];    
        $currentPic['alt'] = (isset($lodgepic['accommodation_roomname'])) ? $lodgepic['accommodation_roomname'] : '';
        $showcasepics[] = $currentPic;
}
}

$showcasepicsCount = count($showcasepics);
$showcasepicsHalfCount = ($showcasepicsCount / 2);

$slice1 = array_slice($showcasepics, 0, $showcasepicsHalfCount);
$slice2 = array_slice($showcasepics, $showcasepicsHalfCount);
1 голос
/ 13 января 2012

array_chunk - разбить массив на куски

<code>$array1 = array("1" => "green", "2" => "brown", "3" => "blue", "4" => "black");
$array2 = array("5" => "yellow","6" => "orange","7"=> "violet","8"=> "white");

$arraylength1   = ceil(count($array1)/2);
$res1           = array_chunk($array1,$arraylength1);
$arraylength2   = ceil(count($array2)/2);
$res2           = array_chunk($array2,$arraylength2);

echo "<pre>";
print_r($res1);
print_r($res2);
echo "
"; выход;

Попробуйте это.

...